Leviev Air is a recently founded private airline from the UK. The airline intends to offer private business trips with its recently acquired fleet of 50 private jets. It targets business professionals and intends to win customers from the established airline market by offering a better service experience for business class travellers while offering a similar or only slightly higher price level.
The investor pitch went well, and the company was able to not only acquire sufficient funding but also adequate jets. Still, the company board struggles with Leviev Air’s positioning in the market. While the targeted segment of business professionals is clear, it remains largely unclear how to attract these high profile customers and how to make business class travellers switch from established airlines to Leviev Air.
To decide on, which values to provide to potential clients and to understand which benefits to communicate to Leviev Air’s potential customer base, the executive board asks you to conduct a thorough market research. The executives want to especially learn which factors business travellers pay attention to and which factors business travellers dislike most with the leading airlines in the field. Unfortunately, Leviev’s initial business plan missed to include a budget for a commercial market research company. Thus, running costly surveys or focus group interviews will not be feasible.
The next day you pull together a checklist to develop substantial business intelligence in the area. By answering the following points with the help of UGC you try to narrow down the positioning strategy for Leviev Air.
To get a better understanding of passenger's online search behaviour we will investigate google trends. To access Google's API we need to activate the pytrends library. In addition we will load the common packages, which we need for data handling pandas and data visualization matplotlib (and probably seaborn) We first the initial packages with the following command.
Let's install the necessary packages. If you have them already you can skip these steps.
!pip install pytrends
!pip install Pillow
!pip install wordcloud
Collecting pytrends Downloading pytrends-4.9.2-py3-none-any.whl (15 kB) Requirement already satisfied: requests>=2.0 in /usr/local/lib/python3.10/dist-packages (from pytrends) (2.31.0) Requirement already satisfied: pandas>=0.25 in /usr/local/lib/python3.10/dist-packages (from pytrends) (1.5.3) Requirement already satisfied: lxml in /usr/local/lib/python3.10/dist-packages (from pytrends) (4.9.3) Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.25->pytrends) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.25->pytrends) (2023.3.post1) Requirement already satisfied: numpy>=1.21.0 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.25->pytrends) (1.23.5) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.0->pytrends) (3.3.2) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.0->pytrends) (3.6) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.0->pytrends) (2.0.7) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.0->pytrends) (2023.11.17) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas>=0.25->pytrends) (1.16.0) Installing collected packages: pytrends Successfully installed pytrends-4.9.2
With the help of the pytrends library we can now check which business class airlines are most popular and compare search volume over time for the business class airlines we are interested in. To do so, we use the following code:
from pytrends.request import TrendReq
import matplotlib.pyplot as plt
import pandas as pd
# Initialize pytrends
pytrends = TrendReq(hl='en-GB')
import time
def get_trends_with_retry(keywords, timeframe='2017-03-05 2022-01-01', geo='GB', gprop='', max_retries=3, delay=60):
for attempt in range(max_retries):
try:
pytrends.build_payload(keywords, cat=0, timeframe=timeframe, geo=geo, gprop=gprop)
return pytrends.interest_over_time()
except TooManyRequestsError:
if attempt < max_retries - 1:
time.sleep(delay) # Wait for 'delay' seconds before retrying
else:
raise
# First set of keywords
keywords1 = ["Emirates Business Class", "British Airways Business Class", "Lufthansa Business Class",
"Air France Business Class", "Turkish Airlines Business Class"]
web_trends_businessclass1 = get_trends_with_retry(keywords1)
The code allows us accessing Google Trends’ App Programing Interface (API) and to get the search result data stored in the web.trends.businessclass data frame. The gtrends function from the package requires the same input than the web interface. We specify the search requests we are interested in, the type of Google Search we are looking for (here we look for web search, alternatively we could also rely on news, images, and youtube searches to access the search results from these categories), the country for which we search (here indicated by UK) and the time frame for which we want results.
To replicate the plot we also see on Google Trends own webpage, we can simply ask Python to plot the dataframe with the Google Trends data.
# Plotting
web_trends_businessclass1.plot(figsize=(12, 6))
plt.title("Google Trends: Business Class Comparisons - Interest Over Time")
plt.show()
Question: What does the graph tell you? What can we learn from the development of the time series? Which events do you recognize?
A quick inspection of the plot shows that we replicated with R the plot we usually obtain from Google’s web interface. On a second look you my discover that the Y-axis does not display the number of web searches. Instead, it ranges from 0 to 100.
This is because Google trends only provides us with relative search results by indexing the day with the highest search volume as 100. Consequently, all other days are reported as a relative measure to the day with the highest volume. In case we have multiple search terms – as in our example – the 100 will be set for the keyword with the highest search volume.
In fact, this means, that we can not compare search volume data from different search terms, if we extract them separately. However, there is an easy work around. We may simply control, which search term enjoys the highest interest and include this term in all searches as a reference. So, we ensure that all data we obtain from Google Trends is relative to this search term and we can thus compare results across different searches. This is especially helpful, as Google Trends only allows us to compare up to 5 search terms per call.
Lets assume we also want to have search results for other Airlines such as KLM, United, Singapore Airlines, and SAS. If we would simply look for these four airlines, Google would index the 100 to the search term with the most interest in this call. To make the results comparable we simply include Emirates in our search, as this is the airline that apparently enjoys most interest and will thus serve for both calls as reference mark. We can extract this data with the following command and then plot the new time series.
# Second set of keywords
keywords2 = ["Emirates Business Class", "KLM Business Class", "Singapore Airlines Business Class",
"United Airlines Business Class", "SAS Business Class"]
web_trends_businessclass2 = get_trends_with_retry(keywords2)
# Plotting
web_trends_businessclass2.plot(figsize=(12, 6))
plt.title("Google Trends: Business Class Comparisons - Set 2")
plt.show()
Using the info() function you can inspect the two objects in your environment and will see that they consist of type of variables.
web_trends_businessclass1.info()
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 252 entries, 2017-03-05 to 2021-12-26 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Emirates Business Class 252 non-null int64 1 British Airways Business Class 252 non-null int64 2 Lufthansa Business Class 252 non-null int64 3 Air France Business Class 252 non-null int64 4 Turkish Airlines Business Class 252 non-null int64 5 isPartial 252 non-null bool dtypes: bool(1), int64(5) memory usage: 12.1 KB
web_trends_businessclass2.info()
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 252 entries, 2017-03-05 to 2021-12-26 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Emirates Business Class 252 non-null int64 1 KLM Business Class 252 non-null int64 2 Singapore Airlines Business Class 252 non-null int64 3 United Airlines Business Class 252 non-null int64 4 SAS Business Class 252 non-null int64 5 isPartial 252 non-null bool dtypes: bool(1), int64(5) memory usage: 12.1 KB
Now for our visualization purposes, we need to fetch data with a different formatting that will enable us to create word clouds.
Let's fetch the trends once again with the intention of storing the "related_queries" variable which is other search terms from Google Trends. We create a new dataframe and store the other search terms (related_queries) in it with the following code. We then combine the two frames. To avoid that we have two times “Emirates Business Class” results, we also filter it out before joining the two frames.
from pytrends.request import TrendReq
pytrends = TrendReq(hl='en-GB')
# Function to fetch related queries
def fetch_related_queries(keywords):
pytrends.build_payload(keywords)
return pytrends.related_queries()
keywords1 = ["Emirates Business Class", "British Airways Business Class",
"Lufthansa Business Class", "Air France Business Class",
"Turkish Airlines Business Class"]
keywords2 = ["Emirates Business Class", "KLM Business Class",
"Singapore Airlines Business Class", "United Airlines Business Class",
"SAS Business Class"]
# Fetch related queries for both sets of keywords
related_queries1 = fetch_related_queries(keywords1)
related_queries2 = fetch_related_queries(keywords2)
# Function to transform related queries into the desired format
def transform_related_queries(related_queries):
transformed = {}
for keyword in related_queries:
# Check if 'top' related queries are available for the keyword
if 'top' in related_queries[keyword]:
df = related_queries[keyword]['top']
df['keyword'] = keyword # Add a column with the keyword
transformed[keyword] = df
return transformed
# Transform both sets of related queries
transformed_related_queries1 = transform_related_queries(related_queries1)
transformed_related_queries2 = transform_related_queries(related_queries2)
# Now, let's combine the related queries from both sets, excluding 'Emirates Business Class' from the second set
combined_related_queries = pd.concat([df for keyword, df in transformed_related_queries1.items()] + [df for keyword, df in transformed_related_queries2.items() if keyword != "Emirates Business Class"])
# Display the combined related queries
print(combined_related_queries.head())
query value keyword 0 dubai 100 Emirates Business Class 1 business class a380 emirates 95 Emirates Business Class 2 emirates a380 92 Emirates Business Class 3 emirates a380 business 91 Emirates Business Class 4 a380 90 Emirates Business Class
Question: Inspect the dataframe webtrends.total. What kind of information might be useful for developing a positioning? What do you learn from the information about the business class market? What implications may this bring for Leviev Air?
To develop a systematic understanding of which search terms of patterns are frequently used we may rely on wordclouds and try to produce a word cloud with the help of the related query keywords.
To work with textdata and to visualize text we need to rely on two more packages: nltk and WordCloud.
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
# Ensure that the necessary NLTK package is downloaded
nltk.download('stopwords')
combined_related_queries['query'] = combined_related_queries['query'].astype(str)
# Tokenize the text data in the 'query' column
tokenizer = RegexpTokenizer(r'\w+')
combined_related_queries['tokens'] = combined_related_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()) if pd.notnull(x) else [])
# Create a flat list of words
words = [word for tokens in combined_related_queries['tokens'] for word in tokens]
# Count the words and filter by frequency
word_freq = Counter(words)
filtered_word_freq = {word: freq for word, freq in word_freq.items() if freq >= 3}
# Remove stopwords
stop_words = set(stopwords.words('english'))
filtered_word_freq = {word: freq for word, freq in filtered_word_freq.items() if word not in stop_words}
[nltk_data] Downloading package stopwords to /root/nltk_data... [nltk_data] Unzipping corpora/stopwords.zip.
We can now start with preparing the search query data. nltk's tokenizer function helps us to split the search queries in the value column of the webtrends.total dataframe into single observations. By doing so we can then count how many times a query is posted and use this information to then produce a wordcloud that includes all search queries which have been at least 3 times used.
# Generate a word cloud with the top 90 words
# By not specifying a font_path, WordCloud will use the default font.
wordcloud = WordCloud(width=800, height=400, max_words=90).generate_from_frequencies(filtered_word_freq)
# Display the word cloud using matplotlib
plt.figure(figsize=(15, 7.5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
Question: What kind of additional information does the word cloud provide? How does this information deviates from your previous inspection? What can we take away from the frequencies?
To understand which airlines are considered and compared together, we can investigate which airlines are often searched with other. This may point us towards different passenger types, which may then ultimately help us to derive implications for Leviev Air. To come to this point we use Pandas masks (example mask: 'dataframe['keyword'] == keyword') to filter function to create separate dataframes for each airline, containing only the airline specific queries. We can then plot these as separate wordcloud with the following code.
def generate_wordcloud_for_keyword(dataframe, keyword):
# Filter the DataFrame for the specified keyword
keyword_queries = dataframe[dataframe['keyword'] == keyword]
# Tokenize the text data in the 'query' column
tokenizer = RegexpTokenizer(r'\w+')
keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
# Create a flat list of tokens
keyword_words = [word for tokens in keyword_queries['tokens'] for word in tokens]
# Count the words and filter by frequency
word_freq = Counter(keyword_words)
filtered_word_freq = {word: freq for word, freq in word_freq.items() if freq >= 3 and word not in stopwords.words('english')}
# Generate a word cloud with the top 90 words
wordcloud = WordCloud(width=300, height=150, max_words=90).generate_from_frequencies(filtered_word_freq)
# Display the word cloud using matplotlib
plt.figure(figsize=(5, 3))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
Note that using the function that we created above, we can call the function with different keywords (airline brand) to visualize individual word clouds.
generate_wordcloud_for_keyword(combined_related_queries, "Emirates Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "British Airways Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "Lufthansa Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "Air France Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "Turkish Airlines Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "KLM Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "Singapore Airlines Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "United Airlines Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
generate_wordcloud_for_keyword(combined_related_queries, "SAS Business Class")
<ipython-input-25-91b1a3a7df7e>:7: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy keyword_queries['tokens'] = keyword_queries['query'].apply(lambda x: tokenizer.tokenize(x.lower()))
Question: From inspecting the related search queries of each airline, which airlines seem to share similar customers, which seem to stand out?
As we now have a clearer understanding of the consideration set of business travelers we can continue with gathering information about what customers like and dislike with the different airlines.
We rely on a general airline review page: Skytrax Airline Quality. You can find the webpage under the following address: https://www.airlinequality.com.
Passengers can leave reviews for specific airilines. These reviews feature a lot of interesting and valuable information covering many interesting aspects of customer experience.
Question: Just browse through the webpage and check the different airlines and the corresponding reviews to develop an idea of which information is valuable and can help Leviev Air with developing a relevant and useful positioning.
To automatically extract the information from the webpage, we can develop a crawler that screens the website. Crawlers need to understand which re-occuring elements from a website you wish to extract. To identify these we need to inspect the source code of the webpage. We can do this with most web browsers. Simply mark the element you are interested in and right click on it. You will find an option which says “Show Source Code” or “Inspect Element”. If you do this for e.g. the review headline and the main review text, you will discover something like the examples shown
Looking at the highlighted areas in the code you will recognize that some of the text you see on the webpage is always preceded by the same code. In case of the general headline of the review we see for both examples the html code
We can take advantage of this and tell R to go through the website code and to look up where the two tags appear in the code and to then always copy/paste for us the text that comes behind these tags. Doing so, we are able to quickly store the information in a dataframe, which we then can analyse later on.
Instead of relying on your browser`s inspection tools, you may similarly rely on other plugins such as the SelectorGadget (https://selectorgadget.com). The tool is a plug in for Chrome and helps you with inspecting CSS and HTML to find the corresponding tags you need to extract data from a website.
We can now use this information to build our very first own crawler. Crawling with Python requires us again to import two common libraries in web crawling: requests and BeautifulSoup
import requests
from bs4 import BeautifulSoup
# URL of the page to scrape
link = "https://www.airlinequality.com/airline-reviews/emirates/?sortby=post_date%3ADesc&pagesize=100"
# Fetch the HTML content
response = requests.get(link)
soup = BeautifulSoup(response.content, 'html.parser')
# Extract review titles
review_titles = [element.get_text(strip=True) for element in soup.find_all(class_="text_header")]
# Display the extracted titles
for title in review_titles:
print(title)
"Just rudeness and criticism" "receive a penalty for the cancellation" "worst customer service" “exceptional service” "Cabin crew helpful" “Comfortable seats” “team were inexperienced” “no request was too much for the crew” "Relatively uneventful flights" "crew were inattentive and disinterested" "It’s price rigging" "was quite unpleasant" "My only suitcase didn't arrive" "discriminating and alienating your passengers" "express my dissatisfaction" "choose another airline" "You ought to do better" "ignored and overlooked" "aggressive cabin manager" "Stay away from this airline" "no transit was possible in Johannesburg" "reaffirmed the low quality of the airline" “service was perfunctory at best” "Service quality fell off a cliff" "ridiculously disappointing and bad" "very disappointed by the service" "shaken our trust in service quality" "lots has changed with Emirates" "Entertainment excellent" "forced us to check our luggage" "refused to tell me any more details" "Disappointment with the experience" "has gone downhill the past few years" "I will not book with them in the future" "refusal to reimburse for damaged luggage" "Cabin crew were really surly" "let’s see if the consistency improves" "on-board internet simply does not work" "I was denied check in" "Emirates seems to suffer from hit and miss crew" "not even willing to listen to you" "a hit or miss airline" "Hope to see improved services" "appreciate the service given" "no more Emirates for us ever" "a great experience" "What a disappointment" "sad, angry and helpless" "certainly never fly with them again" "pleasant and professional" "excelling with their food" "worst experience of my lifetime" "acceptably comfortable" "complete different experience" "bordering on criminal if not unethical" "there was a very kind crew" "Fantastic service from hostess" "must be the worst food" "customer care is horrific" "fell short of expectations" "terrible, expensive travel experience" "decided not to travel with Emirates" "Bright cabin with wide comfortable seats" "they weighed even laptop bag" "worst airline to deal with" "Very disappointed" "Never flying with them again" "Emirates is overrated for everything" "no explanation for the delay" "a very good flight" "service could experience delays" "service could show some improvement" "Check-in was easy" "would not fly with them again" "Beware booking an Emirates codeshare" "won’t be travelling with Emirates again" "treatment and service has been horrible" "Why should we feel hungry on such a long flight?" "Everything went smooth" "shouted for assistance" "What a disappointment" "real Emirates service is not the one they advertise" "I would definitely recommend this airline" "an exceptional flight" "never did the refund" "The service has gone downhill" "Waste of money" "Worst traveling experience" "the most horrible airline" "really bad customer service" "Ground staff are very unfriendly" "Overrated airline" "totally not worth the money" "I was quite disappointed" "I was denied boarding" "the best flight I have ever been on" "worst flight I have ever had" "wait for 4-5 hours for my baggage" "they followed the protocol" "appalling way I and others were treated" The Worlds Best Airlines THE NICEST AIRPORT STAFF THE CLEANEST AIRLINE Emirates Photos
As you can see, we have now crawled all the review titles for Emirates that are available on the site. We already learned above that there are 100 reviews listed on a page at a time, however, looking at review_titles, we see that there are 103 lines. If we take a closer look at the text vector, we see that the .text_header element also appears in the context of the headers for the embedded ads - so not only above the reviews we are interested in. In this case, if we save all .text_header elements, we would be saving information with them that is neither needed nor otherwise useful for our further analysis. To solve the problem, we need to take another look at the structure of the website. We noticed that each review is located in a review “tile”, of which there are exactly 100 on the page. So in our command, we can tell Python to first find all the tiles on the page and then list only the .text_header elements that are in the tiles. So, using the SelectorGadget, we look for the name of the element that marks the tiles in the source code (.comp_media-review-rated) and include that in our code. It will look like this:
link = "https://www.airlinequality.com/airline-reviews/emirates/?sortby=post_date%3ADesc&pagesize=100"
# Fetch the HTML content
response = requests.get(link)
soup = BeautifulSoup(response.content, 'html.parser')
# Extract the first review title within each '.comp_media-review-rated' class
review_titles = [element.select_one('.text_header').get_text(strip=True)
for element in soup.select('.comp_media-review-rated')
if element.select_one('.text_header')]
# Display the extracted titles
for title in review_titles:
print(title)
"Just rudeness and criticism" "receive a penalty for the cancellation" "worst customer service" “exceptional service” "Cabin crew helpful" “Comfortable seats” “team were inexperienced” “no request was too much for the crew” "Relatively uneventful flights" "crew were inattentive and disinterested" "It’s price rigging" "was quite unpleasant" "My only suitcase didn't arrive" "discriminating and alienating your passengers" "express my dissatisfaction" "choose another airline" "You ought to do better" "ignored and overlooked" "aggressive cabin manager" "Stay away from this airline" "no transit was possible in Johannesburg" "reaffirmed the low quality of the airline" “service was perfunctory at best” "Service quality fell off a cliff" "ridiculously disappointing and bad" "very disappointed by the service" "shaken our trust in service quality" "lots has changed with Emirates" "Entertainment excellent" "forced us to check our luggage" "refused to tell me any more details" "Disappointment with the experience" "has gone downhill the past few years" "I will not book with them in the future" "refusal to reimburse for damaged luggage" "Cabin crew were really surly" "let’s see if the consistency improves" "on-board internet simply does not work" "I was denied check in" "Emirates seems to suffer from hit and miss crew" "not even willing to listen to you" "a hit or miss airline" "Hope to see improved services" "appreciate the service given" "no more Emirates for us ever" "a great experience" "What a disappointment" "sad, angry and helpless" "certainly never fly with them again" "pleasant and professional" "excelling with their food" "worst experience of my lifetime" "acceptably comfortable" "complete different experience" "bordering on criminal if not unethical" "there was a very kind crew" "Fantastic service from hostess" "must be the worst food" "customer care is horrific" "fell short of expectations" "terrible, expensive travel experience" "decided not to travel with Emirates" "Bright cabin with wide comfortable seats" "they weighed even laptop bag" "worst airline to deal with" "Very disappointed" "Never flying with them again" "Emirates is overrated for everything" "no explanation for the delay" "a very good flight" "service could experience delays" "service could show some improvement" "Check-in was easy" "would not fly with them again" "Beware booking an Emirates codeshare" "won’t be travelling with Emirates again" "treatment and service has been horrible" "Why should we feel hungry on such a long flight?" "Everything went smooth" "shouted for assistance" "What a disappointment" "real Emirates service is not the one they advertise" "I would definitely recommend this airline" "an exceptional flight" "never did the refund" "The service has gone downhill" "Waste of money" "Worst traveling experience" "the most horrible airline" "really bad customer service" "Ground staff are very unfriendly" "Overrated airline" "totally not worth the money" "I was quite disappointed" "I was denied boarding" "the best flight I have ever been on" "worst flight I have ever had" "wait for 4-5 hours for my baggage" "they followed the protocol" "appalling way I and others were treated"
As you see, we now have 100 rows in the corresponding vector. We can now finally develop a crawler that extracts the review title, the review text, the overall airline rating, the seat category, the type of aircraft, and the route the passenger was booked on.
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
def scrape_airline_reviews(link):
response = requests.get(link)
soup = BeautifulSoup(response.content, 'html.parser')
# Initialize an empty list to store all review details
reviews_data = []
# Extracting review details
reviews = soup.select('.comp_media-review-rated')
for review in reviews:
title = review.select_one('.text_header').get_text(strip=True) if review.select_one('.text_header') else None
text = review.select_one('.text_content').get_text(strip=True) if review.select_one('.text_content') else None
rating = review.select_one('.rating-10 span:nth-child(1)').get_text(strip=True) if review.select_one('.rating-10 span:nth-child(1)') else None
seat_type = next(iter(review.select('.cabin_flown + .review-value')), None).get_text(strip=True) if next(iter(review.select('.cabin_flown + .review-value')), None) else None
aircraft = next(iter(review.select('.aircraft + .review-value')), None).get_text(strip=True) if next(iter(review.select('.aircraft + .review-value')), None) else None
route = next(iter(review.select('.route + .review-value')), None).get_text(strip=True) if next(iter(review.select('.route + .review-value')), None) else None
# Append each review data to the list
reviews_data.append({
'Review Title': title,
'Review Text': text,
'Rating': rating,
'Seat Type': seat_type,
'Aircraft Type': aircraft,
'Route': route
})
return reviews_data
Using this function above, we can provide a link and scrape all the data that we want for a specific airline and store in a dataframe. We are using our new function for Emirates as you can see below.
emirates_reviews = scrape_airline_reviews("https://www.airlinequality.com/airline-reviews/emirates/page/1/?sortby=post_date%3ADesc&pagesize=100")
print(emirates_reviews)
[{'Review Title': '"Just rudeness and criticism"', 'Review Text': '✅Trip Verified| I (via a travel agent) booked a round-trip business class flight with Emirates that ended in Queenstown, NZ. Upon arriving for a layover in Melbourne at 23:30 after a 13-hour business class flight from Dubai, I was looking forward to a shower. However, I was denied entry to the Emirates lounge, without any real explanation as to why. The gentleman at the counter was more interested in making me go away than helping me understand the situation, so, confused, I called Emirates "customer service." They bluntly informed me that if I wanted to use the lounge so badly, my travel agent should have booked the flight from Melbourne to Queenstown on Qantas. As it turns out, the leg from Melbourne to Queenstown that I had was on Emirates partner Jetstar. As Jetstar does not have a business class cabin, this one leg (out of 5 total legs) was economy. I should note that the entire itinerary was booked through Emirates, and part of my confusion stemmed from the fact that they all had Emirates flight numbers. But what I had here was an Emirates flight operated by Jetstar (and the same flight also had a Qantas flight number - one flight, three partners, three numbers). I should have gotten the Emirates flight operated by Qantas that was departing an hour later, as Qantas has a business class cabin, and it would have been the same cost anyway. If it\'s the same cost anyway, why not let me come in and take a shower? It\'s 1am and there is no one else here. Additionally, they do not care if the arriving flight is business, or if 4/5 legs are business, you are not special. No kindness, no attempts at understanding or helpfulness or smoothing over the situation. Just rudeness and criticism. A jarring and unpleasant surprise.', 'Rating': '3', 'Seat Type': 'Business Class', 'Aircraft Type': None, 'Route': 'Dubai to Queenstown via Melbourne'}, {'Review Title': '"receive a penalty for the cancellation"', 'Review Text': '✅Trip Verified| Emirates cancelled my flight on 8-12-23 and changed to 9-12-23. I cannot accept and ask for a change to 7-12-23. They told me "there is no seats" on this day, you can cancel in full for free. I cancel and receive a penalty for the cancellation and I buy a new ticket on the supposed "no seats flight". Impossible to make a complaint online.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Bahrain to Mogadishu via Dubai'}, {'Review Title': '"worst customer service"', 'Review Text': '✅Trip Verified| I was travelling to Tokyo Narita via Dubai. In 2022 I had the meal issues on return journey from NRT To DXB when they could only offer a meal with items I have bad allergies to, Then second meal Cabin Crew forgot to offer, wouldn\'t give any water on 12.5 hour flight. for the recent one I contacted Emirates Customer Service that I have allergies for fish, mushroom and wholemeal, Customer service rep said "bring your own food then and the crew will heat them up" I said it will be taken off me at security at Glasgow if not Dubai" he said no, the day came food was taken off me at Security at Glasgow. As backup they booked me a bland meal that wouldn\'t contain my allergies on DXB to NRT section (GLA-DXB meals were fine) which was Mushroom and second meal fish and mushroom. Which meant no food just a tiny bottle of water. I\'m already worried about the return flights and worries were confirmed when once again meals offered with allergy items, Cabin crew I\'ll give credit concerned, very little food and water. Not just that my seat was broke, headphones broke and the so called ICE entertainment system wouldn\'t work, 12 hours nothing to do and crew couldn\'t move as they already moved others with similar problem, couldn\'t move myself. I recently got a response from Customer Service "out of their control" and one the flight cabin also said they would have refused the my own food and I wouldn\'t have gotten anything through Dubai for second flight. 2024 and 2025 holidays won\'t be with Emirates. Emirates are one of the worst customer service experiences.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Glasgow to Narita via Dubai'}, {'Review Title': '“exceptional service”', 'Review Text': '✅Trip Verified| I was compelled to write a review for an airline because of the exceptional service I got from the whole team of the cabin crew. It was more of a great experience rather than a journey. Right from the entrance to the aircraft I was treated like a beloved family member who came to see the family after years by every staff member. Every single request was taken seriously and was addressed to the best of the availability. I felt that I was the only special passenger for them, they were super nice and highly empathetic in their body language. The air hostess assigned to my area was asking me every single time she passed by me with a great smile if all was good. When you enter the lounge you are greeted with super smiles, if you ask them something they come close to you holding shoulders to show attachment. They were all super devoted to their work, full of energy and trying to help everyone as much they can. I am a frequent flyer of Emirates, though the maintenance inside aircraft has compromised that fresh and modern look but their crew members compensated that by miles. My special thanks and 7 star to every single staff member in the busines class cabin.', 'Rating': '9', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Toronto to Dubai'}, {'Review Title': '"Cabin crew helpful"', 'Review Text': '✅Trip Verified| Check in and boarding was fast. Aircraft is 15 years old but clean and well maintained. Bathroom is clean and bvulgari was supplied. Cabin crew helpful, communicative and offer help, food, or drink. Departure on time and arrival early. I realized why Emirates is more expensive than others.', 'Rating': '9', 'Seat Type': 'Business Class', 'Aircraft Type': 'Boeing 772', 'Route': 'Barcelona to Dubai'}, {'Review Title': '“Comfortable seats”', 'Review Text': '✅Trip Verified| Emirates is always a good choice. Comfortable seats with a large seat pitch and good entertainment program. The on-board catering is good and sufficient. Check-in was extremely quick and the flight was on time. Only the on-board staff seemed annoyed on all flights and, accordingly, the speed and type of service was somewhat disappointing. The ticket prices are high but for a good airline worse to pay.', 'Rating': '9', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800 / Boeing 777-300', 'Route': 'Frankfurt to Colombo via Dubai'}, {'Review Title': '“team were inexperienced”', 'Review Text': 'Not Verified| When is extra leg room, extra leg room. 11 of us travelled on Emirates from Bham to Dubai/Sydney 28 October 23 and returned 16 Nov back into Bham EK0039 flight. We paid for extra leg room seats 80J K H so that we could relax and have sleep on the long journeys ahead of us. On 3 of the trips the air stewards were respectful of our space, given we were next to where they served the food and drinks with their trolleys. They were all quiet during the long flights once drinks and food had been served so myself, husband and son could sleep. However, on the flight from Dubai to Bham this could not be a worse experience if Emirates tried. The team were inexperienced (bar one professional) one of them swearing so we could hear F"** word as the curtains were left open, explaining what she required in men. The food and drinks trolley was left next to my husband within an inch of his feet so they stepped over him each time, apologising for waking him up over the next 3 hours. A team of 6 stood in our area having a meeting. After 4 hours into the 8 hr flight, I politely asked if they could move the trolley so we were not disturbed and it was really disrespectful given we had paid extra for the seat. The deputy and mgr came to see us to apologise and talk to their team and moved the trolley. I showed the mgr a picture. The mgr took my phone and email details to formally respond, but 9 days later still no response. Very disappointing, given 11 of us travelled. The previous 3 flights were really good.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Sydney to Birmingham'}, {'Review Title': '“no request was too much for the crew”', 'Review Text': '✅Trip Verified| This was a short but wonderful fifth freedom ride with Emirates. Despite the fairly short (just under 3 hours) flight Emirates was at the top of their game. Most of what I experienced has been documented many times but the personalized service I received was notable. A delicious meal was artfully served and no request was too much for the crew. A quick walk back to the lounge shared with business class was fun including light conversation with the bartender. Flight was on time and the mounted cameras were a fun way to watch the landing.', 'Rating': '10', 'Seat Type': 'First Class', 'Aircraft Type': 'A380', 'Route': 'Christchurch to Sydney'}, {'Review Title': '"Relatively uneventful flights"', 'Review Text': '✅Trip Verified| BNE-DXB-MAN on 4th & 5th Oct (EK435/EK017) and MAN-DXB-BNE on 19th & 20th Oct (EK020/EK434). All 4 flights in A380s, 3 in seating zone F and 1 in zone B. Seats relatively comfortable and cabin service OK but struggled to find something interesting to watch on IFE on all 4 sectors - that\'s why I always travel with a book - although watching Newcastle Utd hammer PSG at St James\' Park live was a bonus on BNE-DXB sector. Unfortunately there was no wifi or "live" TV coverage on DXB-BNE return sector for which the crew apologised before departing DXB. Relatively uneventful flights that arrived & departed pretty much on time other than a 1hr delay on take off from DXB on final leg - pushed back from gate on time but held on ground for an hour due to ATC "traffic". Emirates actually provide a good "one stop" service from the east coast of Australia to Europe but the 14hr legs to & from DXB can be a struggle. Overall 7/10 and I would use again.', 'Rating': '7', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Brisbane to Manchester via Dubai'}, {'Review Title': '"crew were inattentive and disinterested"', 'Review Text': "Not Verified| I've always loved the Emirates A380 as a comfortable plane to fly but the Business Class cabin is simply too big for the crew and galley capacity, This was a late night departure from LHR where many passengers skipped the meal in favour of sleep, yet for those of us wishing to dine, it took over three hours to complete the service. The crew were inattentive and disinterested, just bringing up a course and then disappearing until they brought the next. It was Economy service with only slightly better food. The smaller cabin in the 777 leg was better service but a much poorer cabin experience. Very difficult in the middle seats, to relax and watch a film when your screen is right next to your neighbour's.", 'Rating': '6', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380 / Boeing 777', 'Route': 'London Heathrow to Phuket via Dubai'}, {'Review Title': '"It’s price rigging"', 'Review Text': '✅Trip Verified| I couldn’t get a business saver so had to opt for more expensive business flex flight. I needed to book in August to use my airmiles. Lo and behold the saver tickets were released a week later making the price £600 cheaper. Emirates refuse to help, their excuse was all these people of 8 different flights had cancelled, therefore making the business saver available! It’s price rigging. Get everyone to buy the more expensive price, then sell the cheaper ones. They are a great airline until anything goes wrong. I can rebook the cheaper flight but it costs me £500 to cancel. Last time I will ever fly with them.', 'Rating': '1', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Singapore to Manchester via Dubai'}, {'Review Title': '"was quite unpleasant"', 'Review Text': '✅Trip Verified|\xa0 \xa0It was my first experience with Emirates which was quite unpleasant by handling from the cabin crews. The screen was broken then they changed you from row 18 to row 45. However, they won’t change to one row before which 17 because all they care is selling the seats instead of passenger’s convenience. Also during 50 mins of turbulence they only allow business class passengers use the toilet and the whole economic class passengers were not allowed. Only BC PAXs have the skill to protect themself during turbulence and EC PAXs can’t do it? I wrote a complaints and they responded that I have accepted the alternative seat but actually I went to original seat which the screen was broken (including call button). This was such a horrible experience and could be the worst during the flight. Not sure I would recommend it to my friends or family.', 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Brussels to Ho Chi Minh City via Dubai'}, {'Review Title': '"My only suitcase didn\'t arrive"', 'Review Text': 'Not Verified| Emirates is an excellent airline, Excellent planes, excellent service, however, they should know that they are servicing all kind of people. On my flight they served Indian food only, when asked why can\'t I get other kind of food, I was told the this route serves about 65 percent Indian customers, what about the other 35 percent, I asked, got no answer or simply, they can go to hell. My only suitcase didn\'t arrive With me at my final distinction, they forgot it in Dubai, this is not the Emirates that was 10 years ago, it shouldn\'t use the logo "fly better" it should now have another logo that say "Lose weight while flying Emirates" since you will not eat for 36 hours on your round trip', 'Rating': '7', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300', 'Route': 'Miami to Medina via Dubai'}, {'Review Title': '"discriminating and alienating your passengers"', 'Review Text': "✅Trip Verified| First I was separated from my wife of 35 years and then despite my plea of a stiff shoulder I was given a window seat in all my 42 years of flying. Emirates seem to treat its tour group passengers as 2nd class passengers without any rights. My wife and I flew to Spain and Portugal from Singapore on a packaged tour with a travel group. On our return flights first from Madrid to Dubai on EK142 on 9 Oct 2023 and from Dubai to Singapore on EK 354 on 10 Oct 2023, my wife and I were placed on window seats on the opposite sides of the aircraft. When I enquired at the check in counter for an aisle seat for the 2 flights as I am a tall bloke with a stiff shoulder (which has been affecting me for the past 5 years), the staff gave me an aisle seat further back and my wife in a window seat 6 rows ahead. She said she tried but could not see the connecting flight seating plan from Dubai to Singapore and advised me to approach the boarding gate in Dubai for help. When we reached Dubai, the tour manager, my wife and I, another another couple who had been in opposite ends of the aircraft made a beeline for the connecting help desk close to B18 boarding gate. The guard refused to let us into the queue even though there was no one queuing and the 2 counter staff were helping a couple of the passengers at the counter. He told us to use the self-help kiosk computer even though we said we needed help with changing the seats. The computer did not do the latter and directed back to the counter. The guard was still reluctant and finally allowed my wife and I in the queue. However, our tour manager and the couple were kept outside the line even though they had legitimate business to speak to someone at the counter. There was a couple talking to a group of the staff outside the counter near the queue and the man was gesticulating wildly in a heated discussion with the staff. Eventually one of the staff involved in the 'conversation' told the guard to admit all of us and 'royally allowed' us to talk to him behind the counter. He told us in no uncertain terms that we were given our seats as 'non-paying' passengers and it was tough luck that we had to be separated. Our tour manager protested that the tour passenger list with familial/partnering connections was given to the airline beforehand but he said we were given a block of seats from rows 81 to 83 and he could not help in any way. My question to the airline is this: if the passenger list has been provided with the different familial/partnering groupings could it not be more accommodating and doing a slipshod job of seating willy nilly without regard for the families and couples travelling together. What happens if there are families with young children? Furthermore if the airline has given a block of seats (say rows 61 to 63 or 81 to 83 and not all window seats or not all middle seats) in advance why can't it have the good sense to pass them on the tour manager beforehand so the tour manager can help to allocate the seats according to the passengers' preference and needs? Even in times of profit squeeze when corporations try to extract every cent from its passengers, how much money can you make to justify discriminating and alienating your passengers just because the 25 of them are travelling as part of a package tour?", 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Singapore to Barcelona via Dubai'}, {'Review Title': '"express my dissatisfaction"', 'Review Text': "✅Trip Verified| I wish to express my dissatisfaction with my recent experience on Emirates Flight EK2185, scheduled for August 6th, 2023, from Dubai to Catania. The flight was canceled less than 24 hours in advance, which severely impacted my long-haul trip. This trip was booked through the Emirates website and was disrupted just hours before its departure due to the cited 'unforeseen circumstances,' namely a fire at Catania Airport, which had occurred three weeks prior. Being an aware passenger, I was cognizant of the previous flight cancellations to Catania and the airport's incapacity to handle extra-Schengen flights. Consequently, I had been diligently monitoring the situation, investing significant time and financial resources from a remote location in South Africa to stay updated and explore alternative travel options in case of an eventual cancellation. My distressing experience began when I found myself caught in a bureaucratic game of ping-pong between Emirates and Flydubai, the airline operating the flight. Both carriers appeared to evade responsibility and failed to offer me any practical alternative plans. The cancellation notification reached me while I was en route to the airport, necessitating an unscheduled stop in an area with phone reception to contact the Emirates call center, as per Flydubai's app recommendation. To my dismay, I spent over 30 minutes on the phone only to discover that Emirates was not presenting any viable options for reaching my final destination. Furthermore, their communication regarding alternative flights from Dubai to Italy was initially unclear—mentioning Rome or Milan—and later, limited to Naples, with no apparent connection to Catania. It was only after a protracted discussion that the call-center operator finally intervened, reconfiguring my entire reservation to a flight bound for Milan, just an hour before my scheduled check-in at Skukuza. This change, which was seemingly necessitated by Emirates' arcane policies, left me in Dubai without compensation for the additional time spent there. I was accommodated in a shared room with no meals, a circumstance that I managed to secure solely because my partner already had a reservation for a Dubai Connect service. Following the call-center operator's instructions, I had to personally book a new flight from Milan to Catania, incurring additional expenses. The overwhelming stress and uncertainty surrounding this ordeal marred a significant portion of my holiday experience. I requested that Emirates recognized the hardships I endured during this journey, including the extra costs incurred due to the days of delay and the missed medical appointment. However, they just said they could do nothing.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Johannesburg to Catania via Dubai'}, {'Review Title': '"choose another airline"', 'Review Text': 'Not Verified| Terrible service, very slow check in. Not trained stewards. I was told that for my toddler the seatbelt was not compulsory (I am not joking). Please choose another airline.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Catania to Kuala Lumpur via Dubai'}, {'Review Title': '"You ought to do better"', 'Review Text': "✅Trip Verified| I was checking in at Counter F1 at KLIA T1, served by your ground staff, Ms Farah around 8.35am to get on EK345 from KL to Dubai. She went ahead to check in my luggage bag and assigned me my seat, 38E. I was shocked and told her I've got a confirmation email that seat 32A was allocated to me (yes, I booked for it in advance using Trip.com). She said it's a 3rd party confirmation and I was supposed to online check in. Gosh... that was ridiculous! You mean an email confirmation is not a confirmation? Fine. I told her I do not mind an aisle seat instead but do not put me in the middle. She made a call and ended up telling me that it cannot be done. Emirates Emirates...you are a World Class Airline but the service you rendered to me on the ground says nothing of that. You ought to do better and shame on you for hiring such an incompetent employee.", 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Kuala Lumpur to Dubai'}, {'Review Title': '"ignored and overlooked"', 'Review Text': "✅Trip Verified| I had a poor experience on this flight. I have been using Emirates' services for over 20 years, being a Blue member and, then, a Silver member, up until the time of covid. I have had no reason to complain, previously about Emirates’ service. Sitting in seat 30F, I had ordered vegetarian food, and received a snack soon after take-off, along with a sealed cup of water. Subsequently, meals for other passengers were brought round and people were offered drinks, but I was offered nothing, and the steward moved on too quickly for me to request a drink. At the next opportunity, when a steward passed by, I requested a drink, but was advised to wait until lunch was served (a very poor response, I felt). I reiterated: I would like a drink as soon as possible (as I was thirsty). The person in seat 30G was asleep and I could not exit the seat with causing a disturbance. A drink was subsequently provided (but over 15 minutes later). However, the table in 30F is/was not secure and the drink slid off, spilled over me and the person in 30G next to me. The people sitting either side of me were more helpful than the steward in trying to clear up the mess. Later on, lunch did arrive, but it was 2 hours after I had first requested a drink (so, my request for a drink had been vindicated). When food trays were later collected, mine was overlooked, the steward passed me by, and my food tray was left for over half an hour. When a steward passed by, I asked that the tray be removed and could not understand why I was being treated in what seemed a negligent manner. At this point, I was beginning to become very fed up. A supervisor later came round and asked if I was alright. I was fine (albeit tired), but frustrated at having been ignored and overlooked. The supervisor was firm, but unapologetic, and asked me if I needed anything. I did not need anything, and she left me without further comment, her enquiry appearing pointless to me, as it solved nothing. Following this experience, I am unlikely to use Emirates again, which has left me thoroughly disillusioned with the company.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300ER', 'Route': 'Dubai to Newcastle'}, {'Review Title': '"aggressive cabin manager"', 'Review Text': "Not Verified| On September 17, I took an Emirates flight with my family. The flight attendants were wonderful except for their aggressive cabin manager. There is absolutely no maturity. Leaving aside his lack of professionalism in leading his team. He was yelling at his team, and we heard him. That doesn't make for a pleasant workplace.", 'Rating': '8', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Bali'}, {'Review Title': '"Stay away from this airline"', 'Review Text': '✅Trip Verified|\xa0\xa0What a nightmare. Taken back to the stand and kept on the plane for 2 hours in sweltering heat with little refreshment and terrible communication from the pilot and staff on board about the fault and when it will be fixed. Absolutely pathetic customer service - it’s like torture on the plane. Stay away from this airline - they do not look after you when there is a problem.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Birmingham'}, {'Review Title': '"no transit was possible in Johannesburg"', 'Review Text': "✅Trip Verified| I made a single reservation with Emirates to fly from Milan to Botswana, via Dubai and Johannesburg. The two flights to and from Botswana were operated by other airlines. On my way to Botswana I made a transit in Dubai and a transit in Johannesburg. On my way back things went bad. We arrived at the airport in Botswana (Maun) and the flight we booked on the Emirates website, was not present. We asked and found out that it had been replaced by another flight, operated by a different airline, at a different time. We checked in for this new flight and found out that no transit was possible in Johannesburg. Therefore we had to go through immigration, retrieve our luggage, queue again for the check in, pass security and passport control to get on our next flight to Dubai. To me it's unbelievable that Emirates did not care to inform us about the flight change and the fact that we could not make a normal transit, like on the first part of our journey. It's a pity because the flight experience has been good, with very nice crew and operating on time.", 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300', 'Route': 'Maun to Dubai via Johannesburg'}, {'Review Title': '"reaffirmed the low quality of the airline"', 'Review Text': '✅Trip Verified| The return journey from HKG to BKK reaffirmed the low quality of the airline that I experienced on the outward journey. Added to that however, was the 50 minutes to queue in the Online Check-in, having arrived at the airport more than the recommended 3 hours before flight departure. This is presumably as a result of only 2 check-in counters open for Online check-in. 2 were available for those who had not checked in, and these seemed to move more quickly. Once through, and with enough time to grab a bite at the airport, the greeting on board was initially friendly, but then the surly attitude of any staff with whom I came into any brief contact, (one, who removed my light hand luggage with laptop, to accommodate a passenger at the Emergency Exit, who\'s steamer trunk "hand luggage" could not fit into the overhead luggage bin above his seat, (which Emirates call "hat rack"; if only). I had heard Emirates were the best on offer in this post pandemic era, but if that is the case, the standard must be extremely low. So low, a low-cost airline would make more sense. As I had eaten before departure, I was able to avoid the food service, and had brought a bottle of water with me, so I did not have to endure the chaotic and illogical F&B service, with its dire offerings.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800', 'Route': 'Hong Kong to Bangkok'}, {'Review Title': '“service was perfunctory at best”', 'Review Text': '✅Trip Verified| In order to mitigate the inordinately inflated prices of Business Class fares, I chose Economy for the first time. Not having much experience of this, I read reviews that Emirates were the best choice for this route BKK-HKG over the usual well established carrier for this route. The service was perfunctory at best. My expectations were low regarding most aspects of the flight, and I was not disappointed, but I had read that service was good quality with pleasant staff. I had zero example of this. Food was delivered haphazardly, and as I had not eaten by the time of take off at 14.05, I ate what was on offer. My low expectations were not disappointed. Anyway, my small experiment with Emirates and Economy are over.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800', 'Route': 'Bangkok to Hong Kong'}, {'Review Title': '"Service quality fell off a cliff"', 'Review Text': "Not Verified| I'll avoid Emirates anytime I find another option, pity, after being frequent flyer for 10 years. Service quality fell off a cliff, proportionally inverse to their skyrocketed prices. Now, imagine imposing a 7KG limit for a trolley and a bag, on a 2k$ flight. It's beyond silly. A laptop and an empty trolley are basically it. It's insane especially considering that this is not a low cost airline, and they have massive profit margins.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Ho Chi Minh to Dubai'}, {'Review Title': '"ridiculously disappointing and bad"', 'Review Text': 'Not Verified| This was the second time I travelled by Emirates. The first one was not so fruitful either but the second trip was just ridiculously disappointing and bad. The flight attendants were rude. The service was extremely bad, seats were smelling of urine and the tv remote was broken. The toilets were filthy and disgusting. When I asked for some wine, one of the crew turns around and tells me "you will be lucky if I can get you some water"!', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Houston'}, {'Review Title': '"very disappointed by the service"', 'Review Text': "✅Trip Verified| I was very very disappointed by the service of the cabin crew. I flew to Mauritius on 21.7.23 with my family and flew back to Glasgow on 18. 08.23. Food service were very poor. The cabin crews took all their times to serve the foods. Some passengers are served first then after hours the rest of the passengers are served. They also served the beverages or the drinks late after the meals. Me and families never got a drink or any beverage at all. I phoned the crews so many times but they never attended us. When I complained to the crew she apologised and promised to bring us some drinks but she never appeared. On our way from Mauritius to dubai in flight EK 704 we got seats which were close to the toilet the floor was wet because of leak. Inform the crew and they took ages to bring a blanket to cover the floor. During the flights the cabin crews supposed to served drinks water or juice but they didn't. They look disinterested to provide a good service. They pulled the curtain so that you can't see them and they themselves eating and drinking. A lots have changed. I wonder where the drinks wines and whiskey are going which are supposed to serve to the passengers. Worst service. I already binned my boarding pass but I remembered seating in zone E 61E.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Mauritius to Glasgow via Dubai'}, {'Review Title': '"shaken our trust in service quality"', 'Review Text': "✅Trip Verified| I am writing to express my disappointment with Emirates Flight EK0243. Despite meticulously tagging our luggage, we were charged an additional $110 by Emirates for inter-baggage transfer. Regrettably, our baggage has been stranded in Dubai for five days. This situation has left us without essentials and with a complete lack of communication or assistance from Emirates. This experience has shaken our trust in the airline's service quality.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Montreal'}, {'Review Title': '"lots has changed with Emirates"', 'Review Text': "✅Trip Verified| It was a few years since I had flown Emirates but albeit in Economy, they provided I believed a better service than most other carriers. Well - in my view, lots has changed with Emirates in the last few years and I believe Quality has become Quantity unless possibly if you are flying Premium or Business. Despite being very polite, ground staff appeared disinterested in assisting for an upgrade both in Durban & Dubai and even their call centre. It was at least 2 hours into the first flight before we had either a drink or food and in 47B by then there was no more food choice. Compared to the other carrier I took south-bound to South Africa, screen on our Emirates B777 to Dubai was old and headphones on both flights uncomfortable. Transfer in Dubai required you are accustomed to your 10,000 steps a day. Sad but per two flights taken, it didn't appear reflective of all the publicity one sees. At least per my own experience on these two flights. Only the A380 was nice and quiet!", 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777 & A380', 'Route': 'Durban to London Gatwick via Dubai'}, {'Review Title': '"Entertainment excellent"', 'Review Text': '✅Trip Verified| Flew on Emirates after several years. Impressive economy cabin with very comfortable seats and a little extra leg room. The airline’s warm ambience is soothing. The cabin was very clean and well maintained. Boarding was well managed at the gate. The economy meal options were superb, extra snacks included with the meal were superb. Entertainment excellent with offerings in multiple languages. The staff were very professional. Perhaps, the attendant serving my zone could have better assisted the passengers with stowing away the carry-ons instead of standing idle and passively greeting. Overall, very evident why Emirates fairs very well in the international flight scene.', 'Rating': '7', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300', 'Route': 'Chennai to Dubai'}, {'Review Title': '"forced us to check our luggage"', 'Review Text': "Not Verified| The trip over was fine. We brought carry-on luggage and had no issues. The plane is nice, the associates are friendly enough, and the food was good. The trip back with them has been awful. They forced us to check our luggage saying no more than 100mls of liquid allowed. We were fine with that but how do they have duty free liquor if they don't allow you to check more than 100 MLS of liquid?? Once in Dubai we went through 3 security checks. I have traveled many places before, including Egypt and Israel and I have never been though so many security checks. The one right before you board made me throw out the water I just bought at the airport. Again, thank god I didn't buy any liquor at duty free. I miss delta.", 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': None}, {'Review Title': '"refused to tell me any more details"', 'Review Text': '✅Trip Verified| I had a First Class Ticket booked with Emirates back in December 2019. I took the outbound flight but the inbound flight was canceled due to Covid-19. Emirates offered a voucher to change my flight for free. However the covid situation was taking too long, I wasn\'t planning to take any flight before the voucher expired. And then, I requested a refund in July 2023 and got emailed back from Emirates. They confirmed that the refund had been approved to Amex (my original payment card). I contacted Amex 10 working days later, and was told that Amex not received the refund. Amex had to fill a form to raise the case for investigation but they need details on "the refund amount". So I contacted Emirates to confirm whether they had refund the ticket or not, and how much was the amount refunded. Emirates representative advised that the other representative was chasing the refund and she refused to tell me any more details, nor give me information on the amount to be refund. I asked to be transfer to the relevant department. She agreed to do so and then hung up the call.', 'Rating': '1', 'Seat Type': 'First Class', 'Aircraft Type': None, 'Route': 'Taipei to London via Dubai'}, {'Review Title': '"Disappointment with the experience"', 'Review Text': 'Not Verified| Disappointment with the experience I had during my recent flights with Emirates. I had a medical condition and needed water to take my medication. Despite politely requesting a glass of water, I was made to wait for an unusually long time before my request was attended to. Furthermore, both my flights to Delhi and back to Dubai experienced significant delays. The delay on my outbound flight caused inconvenience to my schedule and disrupted my plans upon arrival. Similarly, on my return flight, the extended delay left me feeling frustrated and exhausted. Upon my return to Dubai, the baggage retrieval process took an exorbitant amount of time. I waited for more than an hour to receive my baggage. The recent series of unfortunate incidents has left me disheartened and concerned about the overall quality of service provided. I sincerely hope that Emirates takes these matters seriously and addresses the issues promptly.', 'Rating': '4', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Delhi'}, {'Review Title': '"has gone downhill the past few years"', 'Review Text': '✅Trip Verified| Emirates was a great airline for frequent fliers but has gone downhill the past few years. Many of the perks of being a gold member are gone and in general the staff attitude and competency is very low in comparison. As of July 2023 Emirates gold members cannot use the business class check in which was one of the main advantages leaving DXB.', 'Rating': '4', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Dubai to Jakarta'}, {'Review Title': '"I will not book with them in the future"', 'Review Text': '✅Trip Verified| I selected a flight operated by Emirates with a long layover. I was aware that Emirates offers a free layover hotel night if the layover is longer than 8 hours. So, I selected it and paid for it. I qualified for all the criteria including the fact that I booked via Qantas as per the Terms and Conditions stipulated in their website, see here: https://www.emirates.com/english/before-you-fly/dubai-international-airport/dubai-connect/terms-and-conditions/ As stated in the T&C: "Both your inbound and outbound flights to and from Dubai must be an Emirates flight (marketed by Qantas or Emirates) or a Qantas flight (marketed by Emirates or Qantas)." But now that I want to book the free hotel night, I got the feedback: "On reading the last line on the terms and conditions, you see the statement says "The ticket must be issued on an Emirates (176) document." This is the base of the reason for denying the service. How unfair and confusing is that for customers? Super disappointed and I will not book with them in the future.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Nice to Christchurch via Dubai / Melbourne'}, {'Review Title': '"refusal to reimburse for damaged luggage"', 'Review Text': '✅Trip Verified| The issues I encountered include a significant problem with their cancellation policy, lack of responsiveness from their customer service team, concerning safety practices, refusal to reimburse for damaged luggage, an extensive delay during the return flight, and a stark contrast in service quality between Economy and Business class. Regarding the cancellation policy, I received misleading information from three representatives, who assured me that I would receive a full refund if I canceled within 24 hours. However, they failed to mention the crucial condition that this only applied when the flight was at least 7 days after the initial booking. As a result, I tried to cancel within the 24-hour window but could only reschedule. This cost me a $500 loss vs. the option of cancelling and booking a new flight for the following day. Despite Emirates acknowledging in writing their mistake, they repeatedly refused to provide a price match or refund, and eventually even stopped replying to my follow up messages on the open complain. The lack of responsiveness from Emirates compounded my frustration. Numerous follow-up messages went unanswered, showing a lack of interest in resolving the issues I faced. During the flight, I was alarmed by a safety practice where all blankets were collected and piled in front of the emergency exits. Emirates also declined to reimburse me for one of two damaged pieces of luggage, despite the damage occurring during their handling. Furthermore, the return flight experienced a significant delay for a missing document, resulting in passengers being seated on the plane for over two hours, including boarding time. Despite the delay being just a few minutes short of two hours, the lack of updates, assistance, and provisions such as free Wi-Fi or refreshments left passengers feeling inconvenienced and neglected. The service quality and care for Economy class travelers fall short of expectations.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800', 'Route': 'New York to Milan'}, {'Review Title': '"Cabin crew were really surly"', 'Review Text': "✅Trip Verified| First the good: flight not full so seat space was more than adequate and very comfortable. Entertainment was excellent as always on Emirates. Now the not so good: meal was barely passable and did not come with a drink which as a diabetic isn't good. Cabin crew were really surly and did not speak coherent English.", 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Auckland to Dubai'}, {'Review Title': '"let’s see if the consistency improves"', 'Review Text': '✅Trip Verified| What a difference a crew makes. Flight from Dubai was staffed by a really engaging crew for whom nothing was too much trouble. Seat was comfortable but you can tell this was one of the older A380 as part were looking a bit worse for wear. Food on this flight was among some of the best I have ever had. Lounge was busy but to be fair we sat close to the gate and didn’t venture in. Boarding was separate to economy however we still had to wait 10 min even though when we tried it was already 10 min past the boarding time. Got the two return legs to go, let’s see if the consistency improves.', 'Rating': '8', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Singapore'}, {'Review Title': '"on-board internet simply does not work"', 'Review Text': "✅Trip Verified| The on-board internet simply does not work. If you complain, the supplier for Emirates, 'Sita for Aircraft' simply refuse to acknowledge that they failed to provide a service and issue a refund. It appears from multiple reviews that this happens often. Emirates themselves, apart from the non-existent internet and poor third party after-sales experience were pretty good, ample leg room, friendly staff, good selection of movies but poor food choice - fish or vegetables only. The check-in was also poor. I followed the check in signs for economy seats at Dubai airport T3, waited for around 20-30 mins before being told to check in at desk 5 (flights to USA) - i wasn't flying to the USA, how am i supposed to know to follow that sign? Very poor understanding of the customer journey.", 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Tel Aviv'}, {'Review Title': '"I was denied check in"', 'Review Text': "✅Trip Verified| I'm writing this review so others won't go through what went through. This airline has no accountability whatsoever. The day of my flight I was denied check in. The reason was that I had less than 6 month validity on my passport which was not required for my destination. The Emirates agent at the check-in booth told me he wouldn't let me on the flight and then offered my seat to a standby client. Because of this I missed my flight, I had to renew my passeport in less than 24h and lost 2 days stay at the hotel. I had to pay 300$+ ticket as penalty to board on the next flight not to mention the psychological distress I was put under (I have depression/anxiety disorder). I was travelling with a group and someone in my group has checked in with no problem with passport validity less than 6 months. When I contacted Emirates for refund they said the agent didn't declare the incident and put me as no show on the system although I was there in time with the group. I was told by Emirates that without the name of the agent they can do nothing about it. In short Emirates agents can freely deny you your flight manipulate the system and sell your seat to another person and you can do nothing about it.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Tokyo Narita to Tunis via Dubai'}, {'Review Title': '"Emirates seems to suffer from hit and miss crew"', 'Review Text': '✅Trip Verified| Very friendly check in staff, same goes for the lounge staff, however there was only one on the front desk, and was tied up selling with upgrades or lounge access which meant that we had a 10 min wait before we got access. Lounge itself was nice and had just been refurbished, how ever food selection was average with several things having run out and not replaced. Flight it’s self was good but due to midnight departure staff were just going through the motions. The beef tenderloin has to be the driest toughest piece of meat to have ever been served on an airplane. Overall I have had better experiences on other carriers. Emirates seems to suffer from hit and miss crew. Plane landed on time and for the price the service was not unreasonable. Still a bit poor that you don’t even get a limited amount of wifi in business class.', 'Rating': '6', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Munich to Dubai'}, {'Review Title': '"not even willing to listen to you"', 'Review Text': "✅Trip Verified| Did a single booking for my family 3 months prior. Still they split the seats for a long haul 16 hour flight from Dubai to Los Angeles. Instead of giving four seat configuration. Never happened before. The folks at gate terminals very unsupportive and not even willing to listen to you. One word is what they say full flight. Would never ever fly back on this. Yes am skywards members as well, but that doesn't help you as well.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Los Angeles'}, {'Review Title': '"a hit or miss airline"', 'Review Text': '✅Trip Verified| I decided to fly Emirates again after having a very unfortunate first experience with them a few years ago. Well what I can tell now from 4 flights with them is that they are a hit or miss airline. Some crew members will be friendly and professional others on the same flight will be rude and careless. What others have mentioned on these reviews is true, they will run out of meals option easily and you will have to settle with leftovers if you are seated at the rear. I have noticed the aircrafts are becoming very overused, some had broken features and a funny smell. The food is very basic if compared to other premium airlines. I would say Emirates is still a viable option if the price is right and they offer a lot of connections, but they are not my first choice airlines if other middle eastern carriers are in the game.', 'Rating': '7', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Mauritius'}, {'Review Title': '"Hope to see improved services"', 'Review Text': '✅Trip Verified| My family experienced very poor service with Emirates, the issue was with food services, on a 16 hour flight, we get no meal selection, just have to satisfy with leftovers, we were sitting in row 86, 1st time flight attendant says they only have vegetarian meals, ran out of non-vegetarian, the same thing happens at the second meal, also on second time no beverages were served, I had call a flight attendant for beverage service. Not enough time was given to eat our food. May be Emirates would ask customers on their meal preference and stock up accordingly, no beverage services offered at all during the entire flight, we would have to walk up to the service station and ask for water/juice. Hope to see improved services on future Emirates flights.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Houston'}, {'Review Title': '"appreciate the service given"', 'Review Text': '✅Trip Verified| This review is to appreciate the service given by Emirates flying cabin crew Ms Maria during my flight EK648 on 24-06-2023 from DXB to CMB. Her service was exceeding expectation and was supportive at every occasion.', 'Rating': '9', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Dubai to Colombo'}, {'Review Title': '"no more Emirates for us ever"', 'Review Text': "✅Trip Verified| I'm motivated to write this critical review after multiple phone-hours with customer service agents with Emirates in the hope that others would benefit (and that Emirates would listen!). We had booked a return flight from/to STL-COK via YYZ and DXB. The first flight from STL to YYZ was by its code share partner Air Canada. Unfortunately, just a couple weeks before our flight, Air Canada changed the flight time such that it was not possible to catch the flight from YYZ to DXB. We reached out to Emirates, our primary booking partner, to rebook and were provided a rerouting option through ORD (Chicago) for an additional $3300 for 3 tickets. Annoyed by this suggestion, we requested to fly Air Canada flight the day before, which was turned down because of unavailability of economy class tickets. Because of lack of viable options, we decided to drop the flight from STL-YYZ but retain the flights from YYZ-DXB and DXB-COK, with the idea of booking our own flights from STL-YYZ. We booked this flight for the day before, so we also had to book overnight stay in YYZ. When we filed a travel claim which needed a certificate of flight delay, Emirates asked me to reach out to Air Canada. Unfortunately, Air Canada had none of our names in their system and it was impossible to reach their customer service for further assistance. In summary, we have spent almost $2800 (flight tickets + overnight stay) for Air Canada/Emirates' incompetence and are unable to get a 'flight delayed' certificate to process our legitimate claim. Please beware when booking flights through Emirates because it takes absolutely NO responsibility for their code share partners' mistakes. All I received were platitudes such as, 'we understand', 'that is awful', etc. over the phone but with no real help to process our claim. Lesson learned and no more Emirates for us ever!", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'St Louis to Dubai via Toronto'}, {'Review Title': '"a great experience"', 'Review Text': '✅Trip Verified| Excellent service. I flew Dubai- B\'Ham- Dubai in economy class. Emirates has common counters where you can check in your luggage. Initially, I was skeptical (particularly on the DXB-BHX route) but Emirates made no mistakes. This is quite convenient as you can check in quickly and go to the lounge. The flight departed on time, the crew had a smile and were quite professional. Food was sufficient in quantity and quite good with metal cutlery in economy class. There was another snack service followed by juices/hot drinks 1.5 hours before landing. The seating is quite good and has a seat [pitch of 32"). B777s in use by Emirates are getting old and you can see the signs. Their ICE system was excellent. I am not sure I would like the Business class seats here as they weren\'t lie-flat but I was flying economy. Families with kids were well taken care of with flight attendants distributing amenities and offering to take and share instant pictures using Polaroid cameras. The in-flight wifi was free for text messaging using WhatsApp, even in economy if you have Skywards membership. My only complaint during the trip is that the plane was parked far off and required considerable walking at Terminal 3 in Dubai to reach immigration (which was a breeze). Overall, it was a great experience but flights are quite expensive compared to the competition.', 'Rating': '9', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Birmingham to Dubai'}, {'Review Title': '"What a disappointment"', 'Review Text': '✅Trip Verified| What a disappointment. Emirates is lauded as having one of the best inflight experiences in the world. They obviously spend a lot of money marketing the experience as such. The problem with this is that expectations are high. The hard product is good, all be it a little tatty. Service and food quality is poor. Options are limited and there is no dining in demand. It’s the first time I’ve flown business and had my meal served on a tray. Never addressed or welcomed by name aside from when my boarding card was presented on entering the aircraft. Crew were polite when you got their attention, but most of the time they were avoiding eye contact when racing through the cabin. I had just come off a Virgin Atlantic upper class flight and while their upper class seats aren’t great, the service blows emirates out of the water. Fly better? Do better!!', 'Rating': '4', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Glasgow to Dubai'}, {'Review Title': '"sad, angry and helpless"', 'Review Text': 'Not Verified| I didn\'t succeed to take this plane. I reserved two tickets 3 months ago and just 5 days before the flight, I found that the reservation was cancelled automatically because my bank refused the payment at the time of buying. So during these 3 months I didn\'t receive any email or message that notify me about this. The only email that I got it says " Reservation confirmed". I was really shocked when they told me that I can\'t find my reservation because it was already cancelled by the system automatically without any notification. After all, they kept blaming me why I didn\'t check my bank account every day. I have to pay extra 400 euros to book another flight in order to get home in time. Really sad, angry and helpless.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Brussels to Shanghai via Dubai'}, {'Review Title': '"certainly never fly with them again"', 'Review Text': '✅Trip Verified| Emirates is an airline that tries to maximize the amount of money that it can squeeze out of customers, whilst providing the minimum possible service. I find them far less flexible than other airlines, will apply every penalty they can regardless of circumstance, and will not let customers know of the complimentary services they provide so you end up paying extra. The counter staff are generally unhelpful and impatient, and the cabin crew are less professional and appear less trained than other airlines. Definitely would NOT recommend flying with Emirates to anyone. I will certainly never fly with them again.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Amman to Sydney via Dubai'}, {'Review Title': '"pleasant and professional"', 'Review Text': '✅Trip Verified| Every encounter with airline representatives was pleasant and professional. Thank you to Ahmed, who checked me in very early this morning (1:00 am, June 6th), and made sure I was happy with the seating. Also to Zeeshan, who helped me find my way to the lounge, with all its wonderful amenities. Much gratitude to the female Captain, who flew us smoothly from Dubai to JFK and kept us all well informed about a few delays before takeoff.', 'Rating': '10', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A340', 'Route': 'New York JFK to Dubai'}, {'Review Title': '"excelling with their food"', 'Review Text': '✅Trip Verified| Birmingham to Dubai, Boeing 777. Hideous aircraft. Noisy and really uncomfortable. However, very good service and delicious food. Emirates are excelling with their food, compared to last year. Dubai to Auckland A380 as good as you will get in economy. Plenty of space, and so quiet in this magnificent aircraft. Service a wee bit patchy. Had a few young, I would say, new staff. However they tried very hard, and everyone has to start somewhere.', 'Rating': '10', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300 / A380', 'Route': 'Birmingham to Auckland via Dubai'}, {'Review Title': '"worst experience of my lifetime"', 'Review Text': "✅Trip Verified| I had the worst experience of my lifetime flying with Emirates. It all started from Thiruvananthapuram where our travel began, food was just pathetic and the service is just awful. Let alone the seats are not even comfortable with hardly any legroom. Sitting on the seat for less than an hour and you feel your bones crushing on the frame of the seat. The flight attendants seem like overly busy even if they were to walk past you and you ask them for a glass of water. The next leg was the long haul. Both my wife and I were just exhausted with the service and the flight attendants wouldn't even get a band aid after I cut myself from hitting my feet on the fasteners of the seat. We waited for almost an hr after boarding from Dubai to take off and I ended up cutting myself while being seated and I showed my feet to the flight attendant, and she didn't even care to get back to me until my wife had to address it 48 minutes later. The seats are as poor as the first leg. How do you expect customers to sit in these seats for such long-haul flights. No legroom and the people in front when they recline the seat your stuck with the tray on your diaphragm. I seriously dreaded the flight and the attendants as well. There was a lot of overhead Cabin baggage space where she could open and look but instead just chose to stand where she was and asked me if she could move my bag. Then when another passenger had to get his bag up, she asks my wife if the bag was hers and it was the bag of the passenger behind us. She was like it's my bag and leave it there and then the flight attendant got back to us and asked my wife to move her bag and I said no. Why don't you move the other bag instead. She didn't even have the courtesy to look for other bins if it wasn't full. But just stood in her vicinity to put the bag in and get the job done. I don't understand why do these kind of staff even work. Going to TRV via Dubai the men flight attendants were just so rude that they act like they are doing you a favor by getting you a glass of water. They asked if there's anything else like it was a big, huge task for them to get a glass of water. Juice/water/fruits ??", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Trivandrum to Seattle via Dubai'}, {'Review Title': '"acceptably comfortable"', 'Review Text': '✅Trip Verified| \r\nLisbon to Dubai in one of Emirates B777. The process at the airport was fairly efficient, considering that Lisbon airport can be very messy. The flight departed on time. Cabin is wide and very populated, but acceptably comfortable. The Inflight Entertainment is very good, the meals, although not as good as a few years ago, are still above the average for Economy class. The cabin crew is very nice and welcoming.', 'Rating': '7', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Lisbon to Dubai'}, {'Review Title': '"complete different experience"', 'Review Text': '✅Trip Verified| Had the chance to travel in first class but this time with Emirates it was a complete different experience. The lounges, the suites, staff, food, shower on the A380, the limousine service, dedicated Lounge in Dubai, overpassed all my expectations.', 'Rating': '10', 'Seat Type': 'First Class', 'Aircraft Type': 'Boeing 777 / A380', 'Route': 'Hamburg to Bangkok via Dubai'}, {'Review Title': '"bordering on criminal if not unethical"', 'Review Text': '✅Trip Verified| I had the misfortune of booking a flight on Emirates for my daughter to fly as an unaccompanied minor. All flights were expensive so I used an app to find some cheaper flights and booked on line. I must mention that I checked with their terms and conditions to make sure I could call and change the flight to an unaccompanied minor. Firstly I never received the itinerary so I called Emirates to get this sent. Secondly I could barely understand the operator as he mumbled and had a strong accent. Once I had the itinerary I then told them I needed the unaccompanied minor added. Because I had booked flights operated by Emirates but run by Qantas, I needed to call Qantas to make the change. So I called Qantas, they had no record of the flights, then told me I need to change through the airline I booked. I called Emirates again and explained, they then said I assure you it needs to be done by Qantas. I went back and forth from airline to airline multiple times until Emirates then said there is no way I can change to unaccompanied minor and Qantas would not change it either, I finally had enough and asked to speak to someone who knew what they were doing. I spoke to a supervisor who was not rude or anything but stated I’d need to cancel the flight, take the hit and rebook via phone. I don’t think so, referring to their website that says booking electronically then adding a service is perfectly acceptable. So now I have return tickets in my daughters name that we can’t use. This is bordering on criminal if not unethical, Airlines are supposed to be helpful not members of the “Wit” family', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Brisbane to Aucklqnd'}, {'Review Title': '"there was a very kind crew"', 'Review Text': '✅Trip Verified| I have travelled a lot with Emirates but this time there was a very kind crew Gabriel Italian - Ukrainian with a very natural smiling radiating light. His attitude and love for his work was manifested in his kindness.', 'Rating': '10', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800', 'Route': 'Dubai to Perth'}, {'Review Title': '"Fantastic service from hostess"', 'Review Text': '✅Trip Verified| Fantastic service from hostess Malek from Tunisia. Friendly and very efficient. Can see the passion for her job and love for Emirates. Lovely young lady with a great personality. Thank you.', 'Rating': '8', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Johannesburg'}, {'Review Title': '"must be the worst food"', 'Review Text': '✅Trip Verified| This must be the worst food I have ever tasted on an airline trip. Apart from the protein section of the main meal, the rest were inedible! The rolls were stale, rock hard so they were either old stock from previous meals or your caterer is taking advantage. Its carbs and carbs and carbs. Can you not include something fresh like fruit or fruit salad. Really bad Emirates, I was shocked! My earphones were also faulty, I informed the hostess and she said she will tend to it in a while but she never did.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Amsterdam to Durban via Dubai'}, {'Review Title': '"customer care is horrific"', 'Review Text': 'Not Verified| I strongly recommend flying with a different airline if you have an infant. Emirates are not what they used to be and their customer care is horrific. I booked a bassinet for my baby which means booking a middle seat. I booked 3 months in advance so I had the pick of any seat, yet I checked the requirements for a bassinet and was confident I would be allowed one. Obviously for my baby to have a bassinet was more important than me having a comfortable seat so the sacrifice was made and I chose a seat with a bassinet. Upon boarding I was told my baby was too big for a bassinet. I told them she meets the height and weight requirements but they insisted she was too big. They told me if a baby is capable of reaching the bottom of the bassinet they could push out the press studs and collapse the bassinet, implying that only babies who don’t move in their sleep are able to use a bassinet. This left me in complete distress knowing I had 15 hours ahead of me with my infant on my knee on a front row middle seat. I was in a fit of tears and the flight attendant said sorry there’s nothing I can do. Our flight was at 9pm so I had already been awake all day and had no sleep the whole flight. I couldn’t eat because the fold out tray from the chair arm wouldn’t fit in front of me and my baby and the one time she was asleep my meal had two hairs in it. I was so upset I just gave them my tray back (to which they huffed at me for having to take it when they weren’t ready) and didn’t eat for the journey. I then had a 3 hour wait in Dubai before another 7 hour flight. I asked if I could change this seat and they said no the flights was full which caused me to have a panic attack and almost faint after no food or sleep for a very long time. No one attended to me except one passenger and we had to get on the plane and sit in a middle seat for another 7 hours with no sleep. There was a nice attendant on the second flight who allowed me to stand up and eat a danish while my baby slept on my chair. Honestly if I could cancel my return flight and book with another airline I would. I will never ever fly with emirates again.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Sydney to Dubai'}, {'Review Title': '"fell short of expectations"', 'Review Text': 'Not Verified| Unfortunately, my experience on Emirates airlines in economy class from Dubai to Paris CDG fell short of expectations. While I recognize economy class may not offer the same amenities as higher classes, I found the level of service and food to be subpar. Additionally, at Dubai airport, I was required to use an e-boarding pass, only to be informed upon arrival that a paper boarding pass was necessary, causing inconvenience. Furthermore, the air hostesses I encountered displayed a lack of professionalism and at times, seemed uninformed. Regrettably, based on this experience, I am uncertain if I would choose to fly with Emirates again.', 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Paris'}, {'Review Title': '"terrible, expensive travel experience"', 'Review Text': "✅Trip Verified| I usually don't write reviews but it was a terrible, expensive travel experience and unfortunately my return is already booked with them. There was numerous issues. Food was terrible. Menu was badly selected like there was no balance nor properly matched dishes. It didn't taste good either. Snacks were bad too. In both my flights, from London to Dubai and Dubai to Phuket I had same issues with the seat. First seats are low quality shakes wiggles a lot and offers low comfort. Only good thing was leg space. In both flights infotainment system was broken. Cabin crew tried numerous resets which took 30mins each. On the 4th reset both times it worked but then suddenly while watching it stopped working again. They didn't even offer another seat and there was available options. This is crazy! Absolutely worse service and customer support ever. They have no vegetarian option. They only had Indian vegetarian option which is completely different and tailored for Indian cuisine. I would expect them to just change the main dish on the regular meal right but no! They brought vegetarian meal long before everyone else but didn't offer a drink. Cabin crew is always busy at the back and hard to get anything. They didn't offer socks, travel package. Just blanket and small pillow. I did fly with etihad, Quatar airways and Turkish airlines. Emirates was the worst. Turkish airlines offers the best food and customer service. I will never fly with Emirates. Lead cabin crew had no English and wifi is not free as they advertise.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'London to Phuket via Dubai'}, {'Review Title': '"decided not to travel with Emirates"', 'Review Text': "Not Verified| Due to winter storm in Chicago, they cancelled flight from Kochi to Dubai and Dubai to Chicago. The winter storm issue was with the second flight. But they cancelled first flight because they don't want us to stay in Dubai because it will cost them accommodations and food. They took Americans because they have to and canceled our boarding pass after reaching gate and gave back our checked luggage. There were few passengers who had same problem because they told us to stay in our homes and didn't even have new flight to travel the following day. After endless number of calls, we got refund and booked Qatar airways with the same amount but as we booked the previous day,the ticket charge costed 1 lakh something more. But we paid because as it was urgent travelling for us. From that moment onwards we decided not to travel with Emirates. Will never forget the incident and crew was worst.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Kochi to Chicago via Dubai'}, {'Review Title': '"Bright cabin with wide comfortable seats"', 'Review Text': '✅Trip Verified| I recently flew with Emirates from Sydney to Prague, via Dubai. The flights between Sydney and Dubai were in the new Premium Economy Class, sadly not yet available between Dubai and Prague. The economy class legs of the journey were satisfactory given they were only 6 hours in duration. However the Premium Economy flights were definitely a significant improvement, and in my opinion well worth the extra expense. Bright cabin with wide comfortable seats, excellent service, improved food quality and presentation and the bathrooms in a different league from the economy class product. In every way using Premium Economy class greatly improved my travel experience and turned the long journey into something enjoyable, rather than an endurance test. My hope is that this product can be rolled out to more routes in the near future. Highly recommend for those like myself who dread the long journey from Australia to Europe.', 'Rating': '10', 'Seat Type': 'Premium Economy', 'Aircraft Type': 'A380', 'Route': 'Prague to Sydney via Dubai'}, {'Review Title': '"they weighed even laptop bag"', 'Review Text': "✅Trip Verified| My wife travelled on 6th may to Cochin to Auckland via Dubai. In checkin counter, they weighed even laptop bag also and she faced to pay around 27500INR for extra weight and spent around more than 2 hours in the checkin counter. Even if its as per the guidelines of airline this is the first experience we faced such a value less service. We travelled several air lines including low budget, they will not add the laptop in luggage weight due to their dignity. We saw number of persons facing the same. We didn't expected this type squeeze of money from Emirates", 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Cochin to Auckland via Dubai'}, {'Review Title': '"worst airline to deal with"', 'Review Text': '✅Trip Verified| Emirates has been the worst airline to deal with in terms of customer service. My mother travelled from Mumbai to Houston with a bag below maximum weight. In spite of that, the bag came with a wheel torn off. When we reported at the airline service desk, they took pictures and assured us that it would be processed very quickly. This was on March 25th. As of May 3rd, nothing! We called the call centers, multiple numbers, got handed around from one department to another who finally said, keep emailing as no one at the call center or baggage services number can help. Spoke to a supervisor from baggage services and all she could say was, please send the email to claims. I cannot help! Why is it called baggage services then!! My mom flies back in a few days and we are being forced to buy a new bag for her while waiting for Emirates to respond to a simple damaged bag claim! Such a hassle if anything goes wrong.', 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Mumbai to Houston via Dubai'}, {'Review Title': '"Very disappointed"', 'Review Text': '✅Trip Verified| Very disappointed when I approached the stewardess, (who was talking and laughing with a colleague) and asked for a red wine. She responded by saying, ‘it will be easier if you just go and ask at the kitchen at the back! Not the service you expect from Emirates.', 'Rating': '4', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Newcastle to Dubai'}, {'Review Title': '"Never flying with them again"', 'Review Text': "✅Trip Verified| Flight crew prevented passengers from using the restroom 1 hr prior to landing. Very uncomfortable situation when there was no warning whatsoever. The seats are old and the monitors wobble when in flight. The food was bad and the other passengers didn't finish their meals. Never flying with them again", 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777/300', 'Route': 'Dubai to Tel Aviv'}, {'Review Title': '"Emirates is overrated for everything"', 'Review Text': '✅Trip Verified| The quality is super too low. We lost one piece of an airpod at an Emirates EK354 bound to Singapore at 3.30AM local time. once everyone get off the plane, we inform the cabin crew that we lost which means that we seek their assistance to help find it. One cabin crew told “oh it would be so hard to find” without helping us at all, just standing and staring. One flight manager help us instead to open the seat cover and finally we found it. Emirates is overrated for everything. Food taste was so bland, quality of the meat is very mediocre. Cabin crew issuper unfriendly. Seat is not comfortable we cant even sleep properly despite its an A380 (compared to Qantas and SQ).', 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Singapore'}, {'Review Title': '"no explanation for the delay"', 'Review Text': 'Not Verified| On 22 February, I was travelling in Business Class with my mother who was in a wheelchair on EK75. Check-in was smooth and hassle-free. Then, they took us to a dedicated Lounge for Special Handling which was a miserable and gloomy empty boarding lounge. As there was a Costa outlet, we wanted to have a coffee. The outlet was unstaffed and when we asked the dnata staff, she said that the outlet was closed and will remain closed. We were then taken to the boarding lounge. The boarding was done by self-boarding machines gantries. It took 30 seconds per passenger to scan the boarding pass prior to entering the lounge. The lounge was overcrowded. We waited for 50 minutes inside the boarding lounge without any announcement, nor anything on the screen. No information, no explanation for the delay. The ground handling was worse than a low-cost or a charter flight. a disgrace!', 'Rating': '2', 'Seat Type': 'Business Class', 'Aircraft Type': 'A388', 'Route': 'Dubai to Paris'}, {'Review Title': '"a very good flight"', 'Review Text': 'Not Verified| A really good flight today on a long 16 hours and 40 minute flight, from AKL to DBX. Very friendly, attentive crew. Got a good 6+ hours sleep. This was a new plane and everything was spotless and new looking. Toilet was clean. Food tasty and plenty of it with lots of drink and snack runs in between. Plenty of legroom, me being 1.8 metres tall. Entertainment is vast. If there is one criticism, it’s that the seats are quite hard for the length of the flight. A bit more padding would be welcome. All in all a very good flight.', 'Rating': '10', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Auckland to Dubai'}, {'Review Title': '"service could experience delays"', 'Review Text': '✅Trip Verified| Check-in was easy at ICN but with a disappointing lounge situation, Emirates does not own a lounge at ICN. Inflight service was generally great although business class was quite full. Connection in Dubai was also not problematic; security for connecting passengers was fast-flowing and shopping and restaurants were open. Second flight was on a B777-300 but similar levels of comfort and service was for business class. The business class seats could be a bit narrow for some people (including myself), the in-flight service could experience delays as too many business class passengers are waiting to be served, the transit lounge at Dubai tend to be overcrowded and the in-flight Internet offering is far from satisfactory. In my case, the in-flight Internet could be purchased at $19,99 for a 10-hour flight (excluding take-off and landing the Internet would only be provided for ~8 hours at most) and streaming would still be blocked.', 'Rating': '9', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Seoul to Seychelles via Dubai'}, {'Review Title': '"service could show some improvement"', 'Review Text': "✅Trip Verified| A great airline with nice equipment and infrastructure, but its service (especially the ethnic flight attendants assigned to the airline's Korea service) could show some improvement. Slow service with some of the requests not honored as submitted (e.g., red wine given although white was requested), and felt like the flight attendants were not showing high levels of hospitality, on par with Emirates' reputation. Apart from this, great food and beverages selection and nice IFE system. Maybe the in-flight Internet could be revamped (price would be $19.99 for an 8-hour flight but would still block most high-bandwidth uses including streaming).", 'Rating': '5', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Dubai to Seoul'}, {'Review Title': '"Check-in was easy"', 'Review Text': '✅Trip Verified| Mauritius to Dubai. Check-in was easy and also enjoyed priority immigration and security. Emirates uses the Air Mauritius lounge, and the lounge offered better than expected services. Inflight the flight attendants seemed to treat passengers with genuine hospitality: for the first time, felt that the bar at the back of business class cabin was a good place to relax. The food was great and good wine selections. The business class seats could be a bit narrow for some people (including myself), and the in-flight Internet offering is far from satisfactory. In-flight Internet could be purchased at $16.99 for a 6-hour flight (excluding take-off and landing the Internet would only be provided for ~4 hours at most) and streaming would still be blocked.', 'Rating': '9', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Mauritius to Dubai'}, {'Review Title': '"would not fly with them again"', 'Review Text': 'Not Verified| What a terrible first time flight with this airline in old 2x3x2 seating in business class on both flights and flight attendants on the first running around very unorganised and bad food which was inedible. The whole meal is served on a tray. On the Mumbai to Johannesburg after take off crew passed out mattress tops and turned of lights and there was no service as their menu mentioned. Breakfast was served very quickly before landing. This Airline needs to learn about service of Singapore airlines and we would not fly with them again.', 'Rating': '1', 'Seat Type': 'Business Class', 'Aircraft Type': 'Boring 777-300ER', 'Route': 'Mumbai to Johannesburg via dubai'}, {'Review Title': '"Beware booking an Emirates codeshare"', 'Review Text': "✅Trip Verified| Beware booking an Emirates codeshare. I am a current silver member and have booked a flight to Tashkent (Uzbekistan) from Cairo. As Emirates doesn't service Tashkent I was booked on a Fly Dubai (code share) instead. Little did I realise that this (slight) change meant that I do not qualify for lounge access. I, after a few misrepresntations and confusing messages, was advised that I needed to be a gold member to qualify. A transit time of over five hours didn't make that experience very pleasant. This little known fact was never mentioned anywhere during my online booking process. So, beware booking a code share with Emirates, there are strings attached.", 'Rating': '8', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Cairo to Tashkent via Dubai'}, {'Review Title': '"won’t be travelling with Emirates again"', 'Review Text': 'Not Verified| Arriving at Sydney to fly back to the UK with Emirates we joined the ‘Premier Economy Online Checked-in’ queue expecting to quickly go to bag drop and then on to security but instead we soon found that this queue was three times longer than any others. Business/First class was short and the queue for those who’d not checked in at all was barely longer - only the checked-in passengers appeared to be stuck in a 45 minute queue. I tried to ask a member of the check-in staff if we were in the right queue and she just curtly told me yes, I was, without even asking or understanding our passenger class, so basically just a blatant lie to my face. We haven’t actually reached the aircraft yet but already know that we won’t be travelling with Emirates again any time soon.', 'Rating': '1', 'Seat Type': 'Premium Economy', 'Aircraft Type': None, 'Route': 'Sydney to London'}, {'Review Title': '"treatment and service has been horrible"', 'Review Text': '✅Trip Verified| Due to my physical condition, I fly in Business and always request wheelchair assistance. Emirates treatment and service on my Delhi/Barcelona flight (April 3rd) has been horrible. On the first flight EK 513 from Delhi to Dubai, I notified my situation and asked to the crew that, since the connection time to my flight to Barcelona was 1 hour 55 minutes, they would check that I was picked up from the plane quickly. The cabin staff told me "don\'t worry". Upon arrival they told me that I had to wait because there was no finger but stairs. After a while and seeing how nervous I was getting, a first class attendant approached me and told me that she would take my luggage and help me down the stairs because if I didn\'t take the bus on the runway, I wouldn\'t make it to the flight to Barcelona. On the bus there was a person in an Emirates uniform who I asked if she could help me when I got to the terminal to locate a wheelchair because he had very short connection time, he refused! Upon arrival at the terminal there were no wheelchairs, I made it with difficulty to the wheelchair request point and, from there they had me getting on and off several buggies and, luckily, the driver of the last buggy helped me with the luggage to Arrive at the plane after the closing time of the flight. How is it possible that Emirates have not foreseen all this when, the user, requests this help service at the time of purchasing the ticket, therefore, sufficiently in advance? How did they not notify the terminal from the plane that I was arriving with special needs so that someone with a wheelchair or buggy? It is a shame.', 'Rating': '1', 'Seat Type': 'Business Class', 'Aircraft Type': 'BOEIN', 'Route': 'Delhi to Barcelona via Dubai'}, {'Review Title': '"Why should we feel hungry on such a long flight?"', 'Review Text': "✅Trip Verified| \r\nI remember that we were very satisfied with this airline until a few years ago. But now it has been 3 times that we are very dissatisfied with the quality of food and the number of times served on a long flight! Why should we feel hungry on such a long flight and when we asked for food, they only give a small packet of crackers and we have to wait for several hours until it is time to serve their disgusting food? It was not like that before, that's why we surprised!", 'Rating': '4', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Brisbane'}, {'Review Title': '"Everything went smooth"', 'Review Text': 'Not Verified| I was pleasantly surprised by level of service and experience on this flight. Everything went smooth, food was very tasty, great choices of dishes and beverages. Overall, staff was very helpful always trying to accommodate the customer needs', 'Rating': '9', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Warsaw to Phuket via Dubai'}, {'Review Title': '"shouted for assistance"', 'Review Text': '✅Trip Verified| My son had vomited on a flight where my partner had left his seat to request assistance. He had gone to the adjoining cabin where he was ignored. My partner then spoke with an attendant, who started serving drinks/ meal in our cabin, who came to assess the situation and then continued to serve drinks and ignore us. From my seat, I had tried to call out to another FA, who also was serving drinks/ meals in our cabin, however did not acknowledge us. I raised my voice to attract attention to no avail. Another attendant who walked past, I had shouted for assistance, who stopped and provided help. Both the other FAs on separate occasions when approaching to serve us, had apologised and began to excuse their busy schedule but was unable to advise why they did not call for additional assistance. I spoke to a senior attendant, who apologised and advised the approach taken is not protocol and should not have happened.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'London to Dubai'}, {'Review Title': '"What a disappointment"', 'Review Text': '✅Trip Verified| So we paid £4K for 4 tickets to be upgraded to business class, the family wanted to try it out so I thought let’s do it. We checked in at the business class dedicated desk and were advised by the Emirates staff to proceed to gate 7 where we will find the lounge. Hand tickets over and told you don’t have access, no explanation just handed back by some power enjoying jobs worth with no options offered. I was stunned. Checked Emirates website and it clearly states our class of travel has lounge access. This is very frustrating and an underhanded approach from Emirates. Turns out this is correct, but why on earth don’t you train staff to explain this or clearly print on the ticket / emailed ticket / purchase confirmation. This must cause so many issues at the airport for people. You buy business class tickets you always get the lounge - so I thought. A very poor decision on Emirates behalf if you ask me. What a disappointment.', 'Rating': '2', 'Seat Type': 'Business Class', 'Aircraft Type': 'A380', 'Route': 'Heathrow to Male via Dubai'}, {'Review Title': '"real Emirates service is not the one they advertise"', 'Review Text': '✅Trip Verified| Coming from Orlando on a very long flight, the plan departed 2h late and landed late, which caused missing our connection. I have travelled with 2 kids so coming from a 12h long flight and being greeted with a voucher for few meals preselected by airlines (like an apple and tomato sandwich, banana and noodle soup…things that are super unpleasant for kids to start with) super cheap offering and I have to get stuck for almost 5h on the airport with two extremely tired kids with no comfort and proper food due to airline mistake. When I asked the customer support desk to arrange for us at least a lounge or upgrade (min expected from them ), he was so rude and said this is “the best” he will offer and turned his back. So I was extremely disappointed to experience such a treatment from such an airline, they don’t take responsibility to what is their mistake and my feedback is not bothering them at all. The real Emirates service is not the one they advertise to hook you up!', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Kuwait to Orlando via Dubai'}, {'Review Title': '"I would definitely recommend this airline"', 'Review Text': 'Not Verified| My experience onboard Emirates was a good one. The IFE was great, food was good and so was the cabin service. The airline though sent a 777 with the old cabin from Bengaluru to Dubai, which was not so bad, but made me a bit disappointed. The next flight from Dubai to Washington DC also was served by a Boeing 777, but with the latest cabin with a new, big, modern IFE screen and a brighter cabin, which made a difference for the better. Apart from the old cabin, I found the legroom to be quite a bit lesser than what I initially thought. Perhaps I should try the Airbus A380 if I am to get a better experience. But the 777s were also equally nice, at least in Economy. Since I was flying during Covid time, I was also a tad bit disappointed over no hot towels and menu cards in Economy. Overall, I would definitely recommend this airline.', 'Rating': '9', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing B777-300ER', 'Route': 'Kempegowda Bengaluru to Washington Dulles via Dubai'}, {'Review Title': '"an exceptional flight"', 'Review Text': '✅Trip Verified|\xa0\xa0I had an exceptional flight, the staff were considerate and polite. Cabin staff Aaliyah was kind and generous and showed thoughtfulness. I will definitely continue to travel with Emirates again', 'Rating': '8', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Dubai to Durban'}, {'Review Title': '"never did the refund"', 'Review Text': '✅Trip Verified| I purchased 3 round trip tickets for my family members back in November 2022 to fly in March 2023 for approximately $2300, while I was booking I didn’t notice that tickets are non-refundable. With in a first hour after booking I decided to cancel tickets, I called the Emirates customer service and explained the situation I asked if it’s possible to cancel, they said “sure you can” , will refund you the money with in 21 business days. They canceled my tickets and never did the refund. I called they many times after asked for the money they said my tickets not refundable. They should not have cancel them then, they gave me wrong information. Would not recommend to deal with company like that.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'St Petersburg to Dubai'}, {'Review Title': '"The service has gone downhill"', 'Review Text': '✅Trip Verified| Check in at Manchester airport was fine, take off time was delayed by 40 minutes as it arrived 20 minutes late. The service has gone downhill since i last flown with them. There was no drinks services or menu cards, it was not a full flight so had the whole row of seats to myself which i utilised as a bed. The A380-800 is a great plane to fly, plenty of seat and leg room and alo very quiet. The 2nd journey was completely different, the Boeing 777-300er was old, very narrow with limited leg room, the engines were loud,t he comment ‘cattle class‘ comes to mind, there was a vietnamese couple sat next to me, the crew thought i was with them and handed me the same meal & drinks as them, luckily i wanted the same meal as them, she then realised that we were not together when i spoke and asked for a different drink. The crew seemed to lack interest. I would fly with them again but only because of their competitive price', 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800 / Boeing 777-300er', 'Route': 'Manchester to Ho Chi Minh via Dubai'}, {'Review Title': '"Waste of money"', 'Review Text': "✅Trip Verified| I would not have bought the Emirates tickets if I knew I was flying with Qantas. Poor seats and inflight entertainment sucks (Headset point is broken). 4hrs of boredom and food is below average. Airline staff cannot figure out fix the problem or have my seats changed. Waste of money! 800NZD for round ticket AKL to MEL. Done with Emirates and Qantas (I didn't even choose Qantas). Will stick with my fav airlines Qatar and AirNZ!", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Auckland to Melbourne'}, {'Review Title': '"Worst traveling experience"', 'Review Text': '✅Trip Verified| Worst traveling experience in last 20 years of business and leisure traveling. They tried to force me to give my hand carry bag to luggage. To do so, they wasted my time, asked me to stand on the side and made me go and talk to lot of different people. They argue that I can not have hand carry bag and laptop bag separately. To make the situation worst another ground staff at the time of entering plane stopped me and pressurized me to board the plane with just laptop bag (which anyway going to be in my legroom). On many occasions, I paid extra and chose Emirates for the service and comfort which seems to be a thing of a past. From now on I will never choose Emirates if I have an option.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Karachi to Sydney via Dubai'}, {'Review Title': '"the most horrible airline"', 'Review Text': 'Not Verified| This was a nightmare and the most horrible airline I’ve ever taken in my life. Unfriendly staff. Customer care is zero. Whatever I asked for wasn’t done. I needed my seat switched so the crew told me to go look for a seat. Passengers were pretty annoyed of me asking around when she should’ve done that herself to avoid this. Asked for couple things it’s either not available like (tissues) or a mask? Food is terrible. Flight was late so now I will be missing my connection.', 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Chicago to Dubai'}, {'Review Title': '"really bad customer service"', 'Review Text': "✅Trip Verified| On the Emirates return flight from Kolkata there was no option to pay for extra baggage during online check in even though the Emirates website mentions that passengers should be paying for extra baggage during check in to save money. The option to do so was greyed out and unavailable. I ended up paying the equivalent to $270.00 CAD for 1 extra luggage at the Emirates counter at the airport during baggage drop off. I called Emirates to complain and the customer service said it’s because it is a connecting flight from Kolkata and that option is not available. It shouldn't matter because i paid only $100 CAD during the Air Canada check in to Dubai for a stop over on the way to Kolkata. On top of that Emirates didn't update me by email or text messages after online check in. I think Emirates has really bad customer service and I will never fly with this airline again.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Kolkata to Dubai'}, {'Review Title': '"Ground staff are very unfriendly"', 'Review Text': '✅Trip Verified| Ground staff are very unfriendly and not helpful, making my trip unpleasant to start up with. The waiting line is also quite unorganized with no supporting staffs maintaining order. Nonetheless, I was able to check in my luggages and headed to the boarding gate with no big problems. Seating comfort on the economy class in B777 and food quality are above average. The entertainment screen works fine. No delays on departure. I may not want to fly Emirates in the future.', 'Rating': '5', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300', 'Route': 'Dubai to Taipei'}, {'Review Title': '"Overrated airline"', 'Review Text': "Not Verified| Overrated airline. This was my first flight with Emirates after having heard so much hype about it for many years now. Previously I have flown with Qatar airways on the same route. Cons: Terrible seating, very cramped and narrow, not enough space to even move feet. Very little quantity of food - hardly 2-3 spoons of 3 items each, plus bun and butter. Water/drinks served only twice in 6.5 hour flight. No response despite pressing button for assistance. In-flight entertainment sucks. My seat's screen had touchscreen that did not work. Overpriced tickets. Too much walking in Dubai, no buggy service.", 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Copenhagen to Dubai'}, {'Review Title': '"totally not worth the money"', 'Review Text': '✅Trip Verified| In December 2022 I travelled from Sydney to Dubai with Emirates First Class. I was contacted by the Emirates car transfer company prior to collection and informed them the number of passengers and luggage, but the car that arrived was too small and the driver was rude and unhelpful. Check-in was ok, but was not given an express pass and was directed to the business lounge not first class as available for gold members. At boarding time most of the other passengers from economy were boarded before the priority boarding due to lack of staff at the gates. After boarding I asked for my meal after take off but after 1.5 hours nothing had arrived I had to call twice before someone came to me, it took nearly another 20 min before I got my meal, As my teenage children were flying in Premier economy, I checked on them but on both occasions was rudely told to return to seat my by the same cabin crew member and on the second occasion was questioned about my seat, this was totally embarrassing. After landing in Dubai I was not able to enter the first-class lounge unless I paid $420.00 for my son for 20 min, my sons airmiles were missing at the end of the trip. I complained to Emirates about the service and after 8 weeks was told the transfer company was a third party, boarding was a strict policy, that it was my fault not to help myself to some sandwiches, policy on lounge entry, and that my son was not an air miles member (he is), No apology or mention of the cabin crew behaviour, after responding to their response I basically told by them basically Emirates did not care about my business (over $250k) per year. Totally not worth the money or air miles.', 'Rating': '1', 'Seat Type': 'First Class', 'Aircraft Type': 'A380', 'Route': 'Sydney to Dubai'}, {'Review Title': '"I was quite disappointed"', 'Review Text': "✅Trip Verified| I was quite disappointed given how much I paid for the ticket. I had a business trip in Hong Kong and I returned from Hong Kong to Bangkok. The airport was huge but the Emirates ground service was very poor. There was some issues at the check in counter causing me to wait at least half hour for my turn to check in luggage. The seats at the economy class is good, on par with other airlines. The cabin crews are nice and helpful and it seems the cabin crew are all coming from different countries but I don't any Emirati or Middle Eastern cabin crew. I wish there are more Asian food options (I'm Thai) on food instead of Middle Eastern/Arabic food. The inflight entertainment was okay, nothing surprising. With the whole flight experience, I think it is not value for money. Will take other airlines next time instead.", 'Rating': '3', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380-800', 'Route': 'Hong Kong to Bangkok'}, {'Review Title': '"I was denied boarding"', 'Review Text': "✅Trip Verified| Absolutely atrocious service of the ground staff and call center staff. I was denied boarding by their check-in staff, because I had some minor marks on my passport. The staff kept listing out the 'rules' and 'terms and conditions', and even when I asked for some solutions it was back to the rules; literally no insights When I asked about re-booking it's 'we can't help, you need to contact your travel agent'. The staff showed no compassion and provided no useful advice. I had a return flight; my outgoing flight was from London to India, then my return flight was Bahrain to London. They listed me as a 'no-show' on their 'system' - which means they also canceled my Bahrain - London flight, which I can easily make (I will get a new passport in 2 days' time) and then fly to India to continue my trip as planned (minus a few days). To get on that flight from Bahrain to London I have to pay a 200GBP 'change fee' and the difference in fare - for a flight that I have already paid for, and that I would have made.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380', 'Route': 'Gatwick to Dubai'}, {'Review Title': '"the best flight I have ever been on"', 'Review Text': "Not Verified| This is, by far, the best flight I have ever been on! I would give this way more than 10/10 if I could! Food: Meals, drinks, and snacks were absolutely delicious, especially the pizza, turkey sandwich, and more! Seating: We were in the aisle row (no windows, but it was still cool, because I had tons of legroom.) I loved how the seat and headrest reclined and how the tray was so big. Staff: Don't get me started! They were amazing. They attended to all our needs. Hot water? They got you. Lost headphones? They got you. Never seen a nicer staff. Entertainment: Did not exactly broaden to all my interests, but headphones were fully immersive. Amnesties: Oh my god, there's so many! Reclining seat. Bathroom lotion. Goodies bag with toothbrushing tools. The list is endless!", 'Rating': '10', 'Seat Type': 'Economy Class', 'Aircraft Type': 'A380 800', 'Route': 'United States to Dubai'}, {'Review Title': '"worst flight I have ever had"', 'Review Text': 'Not Verified| This was the worst flight I have ever had. Poor customer service from start to end. I flew with Emirates from Gatwick to Dubai with my partner and 5 children. My 4 year old son is Autistic. Their level of service on board is awful, food was below standards. I kept on pressing the assistant bell and no one came over to assist me. I was only served drinks twice on a 7 hour flight. Toilets on board were disgusting. Seats are uncomfortable. I was expecting more from Emirates especially when travelling with a child with a disability. You have better service on British Airways and they are not even that great.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'London Gatwick to Dubai'}, {'Review Title': '"wait for 4-5 hours for my baggage"', 'Review Text': '✅Trip Verified| After arriving at Chicago I had to wait for 4-5 hours for my baggage and missed my Amtrak train ticket even after 4 hours gap. They were sending baggage in groups few people got it in an hour and few of us got were standing for 5 hours.', 'Rating': '2', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777', 'Route': 'Dubai to Chicago'}, {'Review Title': '"they followed the protocol"', 'Review Text': '✅Trip Verified| I would like to say thank you to the cabin crew on flight EK 213 from Dubai-Miami on 01/29/23 for their professional management of a violent person inside the aircraft, despite the delay it brought as a consequence of this unacceptable behavior they followed the protocol for this kind of situation.', 'Rating': '10', 'Seat Type': 'Economy Class', 'Aircraft Type': 'Boeing 777-300ER', 'Route': 'Miami to Jakarta via Dubai'}, {'Review Title': '"appalling way I and others were treated"', 'Review Text': "✅Trip Verified| After being a Skywards member for many years, this time I requested wheelchair assistance. I flew Bangkok to Cape Town and returned from Johannesburg to Bangkok. I was expecting the wheelchair transfers in Dubai to be the usual high standard. Instead of a wheelchair waiting for me as the aircraft opened its doors in Dubai, I was told to walk along the sky bridge and to find a desk that would then provide a wheelchair. I did this and found a group of men who were obviously employed to provide wheelchair assistance standing around talking to each other and did not seem to have any list of passengers who required this assistance. I was told there were not enough wheelchairs and told to walk to another area where there was no seating and I had to stand until an assistant arrived with a wheelchair. I sat in this while we went from one building to another and in the airport train. I was unceremoniously dumped at the seating area at the gate and a very long walk down a corridor and onto the skybridge awaited me. The woman sitting next to me kindly asked it I would like to lean on her arm as we traversed this onto the aircraft. I don't know what would have happened if I had been unable to walk at all. The return trip from Johannesburg to Bangkok was even worse. When we landed in Dubai there were no wheelchairs and I was asked to walk a long distance and up an escalator to an area of seating and told to wait for a golf cart. This did not appear. I was sitting next to a woman whose mobility was even worse than mine and she was in a great deal of pain. We were then told we had to walk to some other area, so the woman and I shuffled off leaning on each other vowing never to fly with Emirates again. This time we were told to wait in an area with no seats at all for a golf cart. I noticed a folded wheelchair up against a wall so I unfolded it and put my companion in it. She was most grateful. No assistance at all from the employees whose job it was to provide assistance. Eventually a golf cart came and I got in. Then there were discussions amongst the so-called assistants, and I was told to get out and wait for a different golf cart. I was the only one in this golf cart and was dumped at the correct gate where I had to walk down the sky bridge to the plane. As I get older I will increasingly need to require wheelchair assistance when I travel alone. But the appalling way I and others were treated at Dubai Airport will certainly influence me when I choose which airline to fly in the future. I go to Africa regularly. Next time I will choose Ethiopian Airlines. If you need wheelchair assistance at Dubai Airport, do not fly with Emirates.", 'Rating': '1', 'Seat Type': 'Economy Class', 'Aircraft Type': None, 'Route': 'Bangkok to Cape Town via Dubai'}]
As you can see, the crawler is now extracting all information for the 100 first reviews. If you like to have more reviews you need to adapt the link so that it leads to the second page of reviews. Inspecting the review page links, we see that the page numbers are basically an element in the URL. So far we used the link for the 1st page with the first 100 reviews
https://www.airlinequality.com/airline-reviews/emirates/page/1/?sortby=post_date%3ADesc&pagesize=100
To access the second page we simply need to exchange the 1 in the URL by a 2.
https://www.airlinequality.com/airline-reviews/emirates/page/2/?sortby=post_date%3ADesc&pagesize=100
If we want to access lets say the reviews between 1800 and 1900, we consequently use 19.
You certainly got the principle here. To make things easier we can instead of typing in each link seperately, use Python’s loop function and ask Python to go from 1 to 21 to extract all 2000 reviews from Emirates in one step with the following code. As you can see, we are now using the two variables page and endpage in a loop. Python will execute the code between the {} brackets until the rule determined behind the while command is fulfilled. In our case this means it will run through the code until the condition page < endpage is fullfilled. So to say until page takes the value 22. As you can the last thing Python does once going through the loop, is to add 1 to the value stored in the variable page. So everytime Python passed one loop, page grows by 2.
# Main function to scrape reviews across multiple pages
def scrape_multiple_pages_airline_reviews(airline, start_page, end_page):
all_reviews = []
base_url = f"https://www.airlinequality.com/airline-reviews/{airline}/page/"
for page in range(start_page, end_page + 1):
url = f"{base_url}{page}/?sortby=post_date%3ADesc&pagesize=100"
all_reviews.extend(scrape_airline_reviews(url))
time.sleep(1.5) # Respectful scraping: pause between requests
return pd.DataFrame(all_reviews)
# Example usage: Scraping Emirates reviews from pages 1 to 30
emirates_skytrax_full = scrape_multiple_pages_airline_reviews("emirates", 1, 30)
print(emirates_skytrax_full.head())
Review Title \
0 "Just rudeness and criticism"
1 "receive a penalty for the cancellation"
2 "worst customer service"
3 “exceptional service”
4 "Cabin crew helpful"
Review Text Rating Seat Type \
0 ✅Trip Verified| I (via a travel agent) booked... 3 Business Class
1 ✅Trip Verified| Emirates cancelled my flight ... 2 Economy Class
2 ✅Trip Verified| I was travelling to Tokyo Nar... 1 Economy Class
3 ✅Trip Verified| I was compelled to write a rev... 9 Business Class
4 ✅Trip Verified| Check in and boarding was fas... 9 Business Class
Aircraft Type Route
0 None Dubai to Queenstown via Melbourne
1 None Bahrain to Mogadishu via Dubai
2 A380 Glasgow to Narita via Dubai
3 A380 Toronto to Dubai
4 Boeing 772 Barcelona to Dubai
As we are only interested in the passengers, who flew Business Class, we need to filter the variable Seat.Type.Airline for the term “Business Class” which we achieve again with the help of Pandas masks.
Emirates_BusinessClass = emirates_skytrax_full[emirates_skytrax_full['Seat Type'] == "Business Class"]
In addition, we want to split the dataframe in satsified and dissatisfied customers. We rely on the NPS concept and use the common NPS split. This means all customers, who rated the experience below 8 are put into the dissatisfied customer frame and all passengers who gave a rating higher than 8 are assigned to the satisfied customer dataframe. However, before we can come to this point, we first need to tell Python that the variable Rating is numeric, as it so far believes it to be a character. We achieve this by applying the pd.to_numeric() function.
# Convert 'Rating' column to numeric
Emirates_BusinessClass['Rating'] = pd.to_numeric(Emirates_BusinessClass['Rating'], errors='coerce')
# Filter for satisfied ratings (Rating > 8)
Emirates_BC_Satisfied = Emirates_BusinessClass[Emirates_BusinessClass['Rating'] > 8]
# Filter for dissatisfied ratings (Rating < 7)
Emirates_BC_Dissatisfied = Emirates_BusinessClass[Emirates_BusinessClass['Rating'] < 7]
<ipython-input-69-0378110c68b7>:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy Emirates_BusinessClass['Rating'] = pd.to_numeric(Emirates_BusinessClass['Rating'], errors='coerce')
By now you have probably figured out that we also included a field that allows you too specify the airline name. You can simply check the URLs from airlinequality.com and see each airline’s url element and fill it in the above code to collect the remaining data.
This also means we can extend our loop from the previous call and embed it in a second loop that goes over all airlines we specific in another variable. Below’s code will crawl now all airlines specified in the variable airline, filter for business class passengers and split the results in satisfied and dissatisfied users. Keep in mind that calling a page too many times, might get you banned, as the website owner might become suspicious of your crawling. To avoid this, we also integrate into our crawler a sleeping time of 1.5 seconds with time.sleep(1.5) at the end of each website call. Like this we ensure that the webpage does not become too suspicious and does not ban us.
Please be prepared for some waiting time, when you execute below’s script. It will certainly take some time to get all airline data from the webpage.
import time
def scrape_multiple_pages_airline_reviews(airline, start_page, end_page):
all_reviews = []
base_url = f"https://www.airlinequality.com/airline-reviews/{airline}/page/"
for page in range(start_page, end_page + 1):
url = f"{base_url}{page}/?sortby=post_date%3ADesc&pagesize=100"
all_reviews.extend(scrape_airline_reviews(url))
time.sleep(1.5) # Respectful scraping: pause between requests
return pd.DataFrame(all_reviews)
airlines = ["turkish-airlines", "lufthansa", "qatar-airways", "singapore-airlines", "british-airways"]
airline_names = ["THY", "Lufthansa", "Qatar", "Singapore", "BritishAirways"]
# Create a dictionary to store DataFrames for each airline and review category
airline_data = {}
for air, airline in enumerate(airlines):
# Scraping all reviews for the current airline
airline_reviews_df = scrape_multiple_pages_airline_reviews(airline, 1, 30)
# Filter Business Class reviews
business_class_reviews = airline_reviews_df[airline_reviews_df['Seat Type'] == "Business Class"]
# Convert 'Rating' column to numeric
business_class_reviews['Rating'] = pd.to_numeric(business_class_reviews['Rating'], errors='coerce')
# Filter for satisfied ratings (Rating > 8)
satisfied_reviews = business_class_reviews[business_class_reviews['Rating'] > 8]
# Filter for dissatisfied ratings (Rating < 7)
dissatisfied_reviews = business_class_reviews[business_class_reviews['Rating'] < 7]
# Store DataFrames in the dictionary
airline_data[airline_names[air]] = {
'SkyTraxFull': airline_reviews_df,
'BusinessClass': business_class_reviews,
'BC.Satisfied': satisfied_reviews,
'BC.Dissatisfied': dissatisfied_reviews
}
<ipython-input-102-823e7ad758c3>:28: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy business_class_reviews['Rating'] = pd.to_numeric(business_class_reviews['Rating'], errors='coerce') <ipython-input-102-823e7ad758c3>:28: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy business_class_reviews['Rating'] = pd.to_numeric(business_class_reviews['Rating'], errors='coerce') <ipython-input-102-823e7ad758c3>:28: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy business_class_reviews['Rating'] = pd.to_numeric(business_class_reviews['Rating'], errors='coerce') <ipython-input-102-823e7ad758c3>:28: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy business_class_reviews['Rating'] = pd.to_numeric(business_class_reviews['Rating'], errors='coerce') <ipython-input-102-823e7ad758c3>:28: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy business_class_reviews['Rating'] = pd.to_numeric(business_class_reviews['Rating'], errors='coerce')
Ok, this took a while! But the waiting was worth it. We can now finally combine the data to compare the share of satisifed and dissatisfied business class passengers across all airlines. We use the nrow function to count how many reviews we have in total, as well as the number of satsified and dissatisfied users. Subsequently, we use pandas concat function to prepare a dataframe in which we calculate the shares of satisfied and dissatisfied users.
# Define the list of airline names used as keys in the airline_data dictionary
airline_keys = ["THY", "Lufthansa", "Qatar", "Singapore", "BritishAirways"]
# Initialize lists to store the counts
Number_Reviews = []
Number_Dissatisfied = []
# Loop through each airline and calculate the required numbers
for airline in airline_keys:
# Access the Business Class DataFrame for each airline
business_class_df = airline_data[airline]['BusinessClass']
# Access the Dissatisfied DataFrame for each airline
dissatisfied_df = airline_data[airline]['BC.Dissatisfied']
# Append the counts to the respective lists
Number_Reviews.append(len(business_class_df))
Number_Dissatisfied.append(len(dissatisfied_df))
# Create a DataFrame for satisfaction rates
Satisfaction_Rates = pd.DataFrame({
'Airline': airline_keys,
'N_Reviews': Number_Reviews,
'N_Dissatisfied': Number_Dissatisfied
})
# Calculate satisfied reviews and their share
Satisfaction_Rates['N_Satisfied'] = Satisfaction_Rates['N_Reviews'] - Satisfaction_Rates['N_Dissatisfied']
Satisfaction_Rates['Share_Satisfied'] = Satisfaction_Rates['N_Satisfied'] / Satisfaction_Rates['N_Reviews']
Satisfaction_Rates['Share_Dissatisfied'] = Satisfaction_Rates['N_Dissatisfied'] / Satisfaction_Rates['N_Reviews']
Satisfaction_Rates.head()
| Airline | N_Reviews | N_Dissatisfied | N_Satisfied | Share_Satisfied | Share_Dissatisfied | |
|---|---|---|---|---|---|---|
| 0 | THY | 557 | 310 | 247 | 0.443447 | 0.556553 |
| 1 | Lufthansa | 533 | 246 | 287 | 0.538462 | 0.461538 |
| 2 | Qatar | 867 | 228 | 639 | 0.737024 | 0.262976 |
| 3 | Singapore | 368 | 124 | 244 | 0.663043 | 0.336957 |
| 4 | BritishAirways | 923 | 581 | 342 | 0.370531 | 0.629469 |
# Let's reformat our dear old Emirates_BusinessClass to add this satisfaction df
# Total number of reviews for Emirates
N_Reviews_Emirates = len(Emirates_BusinessClass)
# Number of dissatisfied reviews (Rating < 7)
N_Dissatisfied_Emirates = len(Emirates_BusinessClass[Emirates_BusinessClass['Rating'] < 7])
# Calculating the number of satisfied reviews
N_Satisfied_Emirates = N_Reviews_Emirates - N_Dissatisfied_Emirates
# Calculating the share of satisfied and dissatisfied reviews
Share_Satisfied_Emirates = N_Satisfied_Emirates / N_Reviews_Emirates
Share_Dissatisfied_Emirates = N_Dissatisfied_Emirates / N_Reviews_Emirates
# Creating the emiRates DataFrame
emiRates = pd.DataFrame({
'Airline': ['Emirates'],
'N_Reviews': [N_Reviews_Emirates],
'N_Dissatisfied': [N_Dissatisfied_Emirates],
'N_Satisfied': [N_Satisfied_Emirates],
'Share_Satisfied': [Share_Satisfied_Emirates],
'Share_Dissatisfied': [Share_Dissatisfied_Emirates]
})
Satisfaction_Rates = pd.concat([Satisfaction_Rates, emiRates], ignore_index=True)
# Print the updated Satisfaction_Rates DataFrame
Satisfaction_Rates
| Airline | N_Reviews | N_Dissatisfied | N_Satisfied | Share_Satisfied | Share_Dissatisfied | |
|---|---|---|---|---|---|---|
| 0 | THY | 557 | 310 | 247 | 0.443447 | 0.556553 |
| 1 | Lufthansa | 533 | 246 | 287 | 0.538462 | 0.461538 |
| 2 | Qatar | 867 | 228 | 639 | 0.737024 | 0.262976 |
| 3 | Singapore | 368 | 124 | 244 | 0.663043 | 0.336957 |
| 4 | BritishAirways | 923 | 581 | 342 | 0.370531 | 0.629469 |
| 5 | Emirates | 587 | 261 | 326 | 0.555366 | 0.444634 |
So we now have all information together in the dataframe Satisfaction.Rates and can finally prepare some graphs.
import seaborn as sns
# Sort the DataFrame based on 'Share_Dissatisfied'
Satisfaction_Rates_sorted = Satisfaction_Rates.sort_values('Share_Dissatisfied', ascending=False)
# Create the bar plot
plt.figure(figsize=(10, 6))
sns.barplot(x='Airline', y='Share_Dissatisfied', data=Satisfaction_Rates_sorted, palette="viridis")
# Set the labels and title
plt.xlabel('Airline')
plt.ylabel('Share of Dissatisfied Users')
plt.title('Rate of Dissatisfied User Reviews per Airline')
plt.ylim(0, 1)
# Display the plot
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
Satisfaction_Rates_sorted = Satisfaction_Rates.sort_values('Share_Dissatisfied', ascending=False)
# Create the bar plot for Share of Satisfied Users
plt.figure(figsize=(10, 6))
sns.barplot(x='Airline', y='Share_Satisfied', data=Satisfaction_Rates_sorted, palette="viridis")
# Set the labels and title
plt.xlabel('Airline')
plt.ylabel('Share of Satisfied Users')
plt.title('Rate of Satisfied User Reviews per Airline')
plt.ylim(0, 1)
# Display the plot
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
From the plot we learn that Qatar Air and Singapore Air share the most satisfied business class travelers, while Turkish Airlines and British Airways share the least satisfied business class travelers. In the middle, we find Lufthansa and Emirates. While the bottom two airlines provide the opportunity to attract the many dissatisfied customers, the upper two airlines may allows us to investigate which things passengers really appreciate. For the latter, we use again wordclouds to investigate the reviews from the satisfied Qatar and Singapore Air customers for often occurring terms and words. Let`s start with Qatar.
But first we need to extract individual dataframes frrom airline_data dictionary into individual dataframes for each airline. Let's do that first and then we can create word cloud for each airline.
# Extracting individual airline DataFrames for Business Class
THY_BusinessClass = airline_data['THY']['BusinessClass']
Lufthansa_BusinessClass = airline_data['Lufthansa']['BusinessClass']
Qatar_BusinessClass = airline_data['Qatar']['BusinessClass']
Singapore_BusinessClass = airline_data['Singapore']['BusinessClass']
BritishAirways_BusinessClass = airline_data['BritishAirways']['BusinessClass']
Qatar_BusinessClass
| Review Title | Review Text | Rating | Seat Type | Aircraft Type | Route | |
|---|---|---|---|---|---|---|
| 6 | “a level of service second to none” | Not Verified| Qatar Airways provides (and has... | 10 | Business Class | A350 | Dubai to Delhi via Doha |
| 13 | "The food was sub par" | ✅Trip Verified| From an epic experience to me... | 3 | Business Class | Boeing 777-300 er | Istanbul to Dubai via Doha |
| 16 | "crew level has come down" | ✅Trip Verified| I have flown with them before ... | 5 | Business Class | None | Seattle to Delhi via Doha |
| 19 | "Food could be improved" | ✅Trip Verified| Great cabin, seats, crew and... | 9 | Business Class | A350-1000 | Denpasar to Doha |
| 20 | "comfort and quality all top" | ✅Trip Verified| Always excellent! Service, f... | 9 | Business Class | Boeing 787-8 | Doha to Denpasar |
| ... | ... | ... | ... | ... | ... | ... |
| 2318 | Qatar Airways customer review | BKK-DOH 16/09/2013. A true 5 star airline. Sea... | 10 | Business Class | None | None |
| 2321 | Qatar Airways customer review | MAN-DOH-SIN-DOH-MAN. A330 first leg. Really co... | 9 | Business Class | None | None |
| 2322 | Qatar Airways customer review | MEL-DOH and DOH-MEL. On flight home mobile pho... | 10 | Business Class | None | None |
| 2325 | Qatar Airways customer review | KHI-DOH-JFK-DOH-KHI August 2013. Staff service... | 6 | Business Class | None | None |
| 2331 | Qatar Airways customer review | SIN-DPS return. SIN-DPS section delayed by an ... | 4 | Business Class | None | None |
867 rows × 6 columns
from nltk.tokenize import word_tokenize
nltk.download('punkt')
# Filter for satisfied reviews in Qatar Business Class (Rating > 7)
Qatar_BC_Satisfied = Qatar_BusinessClass[Qatar_BusinessClass['Rating'] > 7]
# Tokenize words in the reviews
words = []
for review in Qatar_BC_Satisfied['Review Text']:
words.extend(word_tokenize(review.lower()))
# Count the frequency of each word
word_freq = Counter(words)
# Filter for words with a frequency of 15 or more
filtered_words = {word: freq for word, freq in word_freq.items() if freq >= 15}
# Generate the word cloud
wordcloud = WordCloud(width=800, height=400, max_words=30, background_color='white').generate_from_frequencies(filtered_words)
# Plot the word cloud
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
[nltk_data] Downloading package punkt to /root/nltk_data... [nltk_data] Package punkt is already up-to-date!
A quick inspection of the plot reveals, that the wordcloud does not provide any useful information. There are two reasons for this. First of all, we only see frequently occuring words such as the, two, of, or and. In linguistics these words are often referred to as stopwords. Only by removing these words we are able to find relevant words with a high occurrence. In addition, we must realize that looking at single words, makes it hard to interpret the meaning. Therefore we do not use the token function on word level, but on bigram level. Bigrams are a combination of words that are occuring together. With the following code we can print the bigram wordclouds that do not feature any stopwords.
from nltk.corpus import stopwords
from nltk import bigrams
nltk.download('stopwords')
def generate_bigram_wordcloud(airline_reviews, min_freq=5, max_words=30):
# Filter for satisfied reviews (Rating > 8)
satisfied_reviews = airline_reviews[airline_reviews['Rating'] > 8]
# Generate bigrams
bigram_freq = Counter()
stop_words = set(stopwords.words('english'))
for review in satisfied_reviews['Review Text']:
words = [word.lower() for word in word_tokenize(review) if word.isalpha() and word.lower() not in stop_words]
bigram_freq.update(Counter(bigrams(words)))
# Filter for bigrams with a specified minimum frequency
filtered_bigrams = {f'{bigram[0]} {bigram[1]}': freq for bigram, freq in bigram_freq.items() if freq >= min_freq}
# Generate the word cloud
wordcloud = WordCloud(width=800, height=400, max_words=max_words, background_color='white').generate_from_frequencies(filtered_bigrams)
# Plot the word cloud
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
[nltk_data] Downloading package stopwords to /root/nltk_data... [nltk_data] Package stopwords is already up-to-date!
Now we created our function, we can use it for each airline to see word cloud for each individual airlines.
generate_bigram_wordcloud(Qatar_BusinessClass, min_freq=5, max_words=30)
generate_bigram_wordcloud(Singapore_BusinessClass, min_freq=5, max_words=30)
generate_bigram_wordcloud(THY_BusinessClass, min_freq=5, max_words=30)
generate_bigram_wordcloud(BritishAirways_BusinessClass, min_freq=5, max_words=30)
Question: Which things to satisfied customers especially highlight? What things do dissatisfied customers mostly complain about? What can we take away from this discussion for our positioning of Leviev Air?
To finally understand on which routes Leviev faces the best potential to acquire dissatisfied customers from British Airways and Turkish Airlines, we can at least see on which routes we observe the most dissatisfied reviews. To achieve this, we use pandas groupby function with the summarise command to count how many times a route was mentioned in the corresponding dataframes. In addition, we only want to look at routes which are mentioned more than two times. Furthermore we rely on pandas dropna() to exclude all reviews in which no route was provided.
THY_BC_Dissatisfied = THY_BusinessClass[THY_BusinessClass['Rating'] < 7]
# Group by 'Route.Airline', count the number of reviews, and add 'Airline' column
Dis_routes_THY = THY_BC_Dissatisfied.groupby('Route').size().reset_index(name='Number')
Dis_routes_THY['Airline'] = 'THY'
# Filter out groups with fewer than three reviews and drop NA
Dis_routes_THY = Dis_routes_THY[Dis_routes_THY['Number'] > 2].dropna()
# Display the structure of the DataFrame
print(Dis_routes_THY.head())
Route Number Airline 105 Istanbul to London 3 THY 146 Los Angeles to Istanbul 3 THY
BritishAirways_BC_Dissatisfied = BritishAirways_BusinessClass[BritishAirways_BusinessClass['Rating'] < 7]
# Group by 'Route.Airline', count the number of reviews, and add 'Airline' column
Dis_routes_BA = BritishAirways_BC_Dissatisfied.groupby('Route').size().reset_index(name='Number')
Dis_routes_BA['Airline'] = 'B.A.'
# Filter out groups with fewer than three reviews and drop NA
Dis_routes_BA = Dis_routes_BA[Dis_routes_BA['Number'] > 2].dropna()
# Display the structure of the DataFrame
print(Dis_routes_BA.head())
Route Number Airline 7 Athens to London 5 B.A. 12 BKK to LHR 3 B.A. 17 Bangkok to London 4 B.A. 36 Cape Town to London 5 B.A. 41 Chicago to London Heathrow 4 B.A.
From a quick inspection with head() we learn that for THY only the connection between Istanbul and London appears multiple times. This is rather unsurprising as Istanbul is THY’s main hub.
In case of BA we find however more routes. So let’s see if we can use a plot to learn more.
# Sort the DataFrame based on 'Number' in descending order
Dis_routes_BA_sorted = Dis_routes_BA.sort_values('Number', ascending=False)
# Create the bar plot
plt.figure(figsize=(10, 6))
barplot = sns.barplot(x='Route', y='Number', data=Dis_routes_BA_sorted, palette="viridis")
# Set the labels and title
plt.xlabel('Route')
plt.ylabel('N')
plt.title('Number of times a route is mentioned in a negative review')
# Rotate x-axis labels for better visibility
plt.xticks(rotation=90)
# Show the plot
plt.tight_layout()
plt.show()
It looks like that British Airways business class passengers are especially unhappy on flights from and to Johannesburg, Hong Kong, New York, Chicago and Bangkog. Keep in mind that passengers have coded the routes differently, and we could still improve the graph by e.g. combining LHR to HKG with London to Hong Kong or by combining tours so that we combine London to Johannesburg with Johannesburg to London. Still the graph already helps us to determine the routes with the most upset customers, which we can now target.
Leviev Air can now take these insights as a starting point for their launch campaign. One way to leverage these insights could be a Search Engine Advertising campaign (SEA) in which Leviev uses keywords related to the identified routes with high volume of dissatisfied customers. Meanwhile, Leviev Air may also accentuate its priority service, high service quality and its full bed seats and on board entertainment service.